{
 "cells": [
  {
   "cell_type": "code",
   "id": "initial_id",
   "metadata": {
    "collapsed": true,
    "ExecuteTime": {
     "end_time": "2025-02-08T01:34:07.322430Z",
     "start_time": "2025-02-08T01:34:01.125574Z"
    }
   },
   "source": [
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "import numpy as np\n",
    "import sklearn\n",
    "import pandas as pd\n",
    "import os\n",
    "import sys\n",
    "import time\n",
    "from tqdm.auto import tqdm\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "\n",
    "print(sys.version_info)\n",
    "for module in mpl, np, pd, sklearn, torch:\n",
    "    print(module.__name__, module.__version__)\n",
    "    \n",
    "device = torch.device(\"cuda:0\") if torch.cuda.is_available() else torch.device(\"cpu\") #torch.device()返回一个Device对象，表示当前使用的设备。如果检测到GPU可用，则选择第一个GPU设备（索引为0）作为计算设备，否则选择CPU设备。\n",
    "print(device)\n"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "sys.version_info(major=3, minor=12, micro=3, releaselevel='final', serial=0)\n",
      "matplotlib 3.10.0\n",
      "numpy 1.26.4\n",
      "pandas 2.2.3\n",
      "sklearn 1.6.1\n",
      "torch 2.5.1+cpu\n",
      "cpu\n"
     ]
    }
   ],
   "execution_count": 1
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "## 数据准备",
   "id": "7c25d0022d4d0ed4"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-08T01:34:09.577836Z",
     "start_time": "2025-02-08T01:34:07.324550Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from torchvision import datasets\n",
    "from torchvision.transforms import ToTensor\n",
    "from torchvision import transforms\n",
    "\n",
    "\n",
    "# 定义数据集的变换\n",
    "transform = transforms.Compose([\n",
    "    transforms.ToTensor(), # 转换为tensor，进行归一化：将像素值从原始范围（如0-255的整数）缩放到浮点数范围[0.0, 1.0]\n",
    "    # transforms.Normalize(mean, std) # 标准化，mean和std是数据集的均值和方差\n",
    "]) #transforms.Compose()函数可以将多个transforms组合起来，并应用到数据集上。\n",
    "# fashion_mnist图像分类数据集，衣服分类，60000张训练图片，10000张测试图片\n",
    "train_ds = datasets.FashionMNIST(\n",
    "    root=\"../data\",\n",
    "    train=True,\n",
    "    download=True,\n",
    "    transform=transform\n",
    ")\n",
    "\n",
    "test_ds = datasets.FashionMNIST(\n",
    "    root=\"../data\",\n",
    "    train=False,\n",
    "    download=True,\n",
    "    transform=transform\n",
    ")\n",
    "\n",
    "# torchvision 数据集里没有提供训练集和验证集的划分\n",
    "# 当然也可以用 torch.utils.data.Dataset 实现人为划分"
   ],
   "id": "6e3dcb03da5d2cef",
   "outputs": [],
   "execution_count": 2
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-08T01:34:09.586469Z",
     "start_time": "2025-02-08T01:34:09.578837Z"
    }
   },
   "cell_type": "code",
   "source": "type(train_ds)",
   "id": "f14924cd46b1a1ef",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torchvision.datasets.mnist.FashionMNIST"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 3
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-08T01:34:09.592766Z",
     "start_time": "2025-02-08T01:34:09.587468Z"
    }
   },
   "cell_type": "code",
   "source": "len(train_ds)",
   "id": "c06f9ed87afa5947",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "60000"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 4
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-08T01:34:09.619018Z",
     "start_time": "2025-02-08T01:34:09.593766Z"
    }
   },
   "cell_type": "code",
   "source": "type(train_ds[0])",
   "id": "e80ce1a24ff0753e",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tuple"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 5
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-08T01:34:09.627381Z",
     "start_time": "2025-02-08T01:34:09.621014Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 通过id取数据，取到的是一个元祖,是第一个样本,在训练时，把特征和标签分开\n",
    "img, label = train_ds[0] #\n",
    "img.shape\n",
    "# img.shape = (1, 28, 28)，这是因为通道数在最前面\n"
   ],
   "id": "f8a3b5b1ac6bb4c7",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([1, 28, 28])"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 6
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-08T01:34:09.638076Z",
     "start_time": "2025-02-08T01:34:09.629379Z"
    }
   },
   "cell_type": "code",
   "source": "type(img) #tensor中文是 张量,和numpy的ndarray类似",
   "id": "ea75e20b238fc88b",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Tensor"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 7
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-08T01:34:09.676217Z",
     "start_time": "2025-02-08T01:34:09.639075Z"
    }
   },
   "cell_type": "code",
   "source": "img[0] #取出第一张图片的像素值",
   "id": "872ce84c49be46bf",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0039, 0.0000, 0.0000, 0.0510, 0.2863, 0.0000,\n",
       "         0.0000, 0.0039, 0.0157, 0.0000, 0.0000, 0.0000, 0.0000, 0.0039, 0.0039,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0118, 0.0000, 0.1412, 0.5333, 0.4980, 0.2431,\n",
       "         0.2118, 0.0000, 0.0000, 0.0000, 0.0039, 0.0118, 0.0157, 0.0000, 0.0000,\n",
       "         0.0118],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0235, 0.0000, 0.4000, 0.8000, 0.6902, 0.5255,\n",
       "         0.5647, 0.4824, 0.0902, 0.0000, 0.0000, 0.0000, 0.0000, 0.0471, 0.0392,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.6078, 0.9255, 0.8118, 0.6980,\n",
       "         0.4196, 0.6118, 0.6314, 0.4275, 0.2510, 0.0902, 0.3020, 0.5098, 0.2824,\n",
       "         0.0588],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0039, 0.0000, 0.2706, 0.8118, 0.8745, 0.8549, 0.8471,\n",
       "         0.8471, 0.6392, 0.4980, 0.4745, 0.4784, 0.5725, 0.5529, 0.3451, 0.6745,\n",
       "         0.2588],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0039, 0.0039, 0.0039, 0.0000, 0.7843, 0.9098, 0.9098, 0.9137, 0.8980,\n",
       "         0.8745, 0.8745, 0.8431, 0.8353, 0.6431, 0.4980, 0.4824, 0.7686, 0.8980,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.7176, 0.8824, 0.8471, 0.8745, 0.8941,\n",
       "         0.9216, 0.8902, 0.8784, 0.8706, 0.8784, 0.8667, 0.8745, 0.9608, 0.6784,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.7569, 0.8941, 0.8549, 0.8353, 0.7765,\n",
       "         0.7059, 0.8314, 0.8235, 0.8275, 0.8353, 0.8745, 0.8627, 0.9529, 0.7922,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0039, 0.0118, 0.0000, 0.0471, 0.8588, 0.8627, 0.8314, 0.8549, 0.7529,\n",
       "         0.6627, 0.8902, 0.8157, 0.8549, 0.8784, 0.8314, 0.8863, 0.7725, 0.8196,\n",
       "         0.2039],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0235, 0.0000, 0.3882, 0.9569, 0.8706, 0.8627, 0.8549, 0.7961,\n",
       "         0.7765, 0.8667, 0.8431, 0.8353, 0.8706, 0.8627, 0.9608, 0.4667, 0.6549,\n",
       "         0.2196],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0157, 0.0000, 0.0000, 0.2157, 0.9255, 0.8941, 0.9020, 0.8941, 0.9412,\n",
       "         0.9098, 0.8353, 0.8549, 0.8745, 0.9176, 0.8510, 0.8510, 0.8196, 0.3608,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0039, 0.0157, 0.0235, 0.0275, 0.0078, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.9294, 0.8863, 0.8510, 0.8745, 0.8706, 0.8588,\n",
       "         0.8706, 0.8667, 0.8471, 0.8745, 0.8980, 0.8431, 0.8549, 1.0000, 0.3020,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0118, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.2431, 0.5686, 0.8000, 0.8941, 0.8118, 0.8353, 0.8667, 0.8549, 0.8157,\n",
       "         0.8275, 0.8549, 0.8784, 0.8745, 0.8588, 0.8431, 0.8784, 0.9569, 0.6235,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0706, 0.1725, 0.3216, 0.4196, 0.7412,\n",
       "         0.8941, 0.8627, 0.8706, 0.8510, 0.8863, 0.7843, 0.8039, 0.8275, 0.9020,\n",
       "         0.8784, 0.9176, 0.6902, 0.7373, 0.9804, 0.9725, 0.9137, 0.9333, 0.8431,\n",
       "         0.0000],\n",
       "        [0.0000, 0.2235, 0.7333, 0.8157, 0.8784, 0.8667, 0.8784, 0.8157, 0.8000,\n",
       "         0.8392, 0.8157, 0.8196, 0.7843, 0.6235, 0.9608, 0.7569, 0.8078, 0.8745,\n",
       "         1.0000, 1.0000, 0.8667, 0.9176, 0.8667, 0.8275, 0.8627, 0.9098, 0.9647,\n",
       "         0.0000],\n",
       "        [0.0118, 0.7922, 0.8941, 0.8784, 0.8667, 0.8275, 0.8275, 0.8392, 0.8039,\n",
       "         0.8039, 0.8039, 0.8627, 0.9412, 0.3137, 0.5882, 1.0000, 0.8980, 0.8667,\n",
       "         0.7373, 0.6039, 0.7490, 0.8235, 0.8000, 0.8196, 0.8706, 0.8941, 0.8824,\n",
       "         0.0000],\n",
       "        [0.3843, 0.9137, 0.7765, 0.8235, 0.8706, 0.8980, 0.8980, 0.9176, 0.9765,\n",
       "         0.8627, 0.7608, 0.8431, 0.8510, 0.9451, 0.2549, 0.2863, 0.4157, 0.4588,\n",
       "         0.6588, 0.8588, 0.8667, 0.8431, 0.8510, 0.8745, 0.8745, 0.8784, 0.8980,\n",
       "         0.1137],\n",
       "        [0.2941, 0.8000, 0.8314, 0.8000, 0.7569, 0.8039, 0.8275, 0.8824, 0.8471,\n",
       "         0.7255, 0.7725, 0.8078, 0.7765, 0.8353, 0.9412, 0.7647, 0.8902, 0.9608,\n",
       "         0.9373, 0.8745, 0.8549, 0.8314, 0.8196, 0.8706, 0.8627, 0.8667, 0.9020,\n",
       "         0.2627],\n",
       "        [0.1882, 0.7961, 0.7176, 0.7608, 0.8353, 0.7725, 0.7255, 0.7451, 0.7608,\n",
       "         0.7529, 0.7922, 0.8392, 0.8588, 0.8667, 0.8627, 0.9255, 0.8824, 0.8471,\n",
       "         0.7804, 0.8078, 0.7294, 0.7098, 0.6941, 0.6745, 0.7098, 0.8039, 0.8078,\n",
       "         0.4510],\n",
       "        [0.0000, 0.4784, 0.8588, 0.7569, 0.7020, 0.6706, 0.7176, 0.7686, 0.8000,\n",
       "         0.8235, 0.8353, 0.8118, 0.8275, 0.8235, 0.7843, 0.7686, 0.7608, 0.7490,\n",
       "         0.7647, 0.7490, 0.7765, 0.7529, 0.6902, 0.6118, 0.6549, 0.6941, 0.8235,\n",
       "         0.3608],\n",
       "        [0.0000, 0.0000, 0.2902, 0.7412, 0.8314, 0.7490, 0.6863, 0.6745, 0.6863,\n",
       "         0.7098, 0.7255, 0.7373, 0.7412, 0.7373, 0.7569, 0.7765, 0.8000, 0.8196,\n",
       "         0.8235, 0.8235, 0.8275, 0.7373, 0.7373, 0.7608, 0.7529, 0.8471, 0.6667,\n",
       "         0.0000],\n",
       "        [0.0078, 0.0000, 0.0000, 0.0000, 0.2588, 0.7843, 0.8706, 0.9294, 0.9373,\n",
       "         0.9490, 0.9647, 0.9529, 0.9569, 0.8667, 0.8627, 0.7569, 0.7490, 0.7020,\n",
       "         0.7137, 0.7137, 0.7098, 0.6902, 0.6510, 0.6588, 0.3882, 0.2275, 0.0000,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1569, 0.2392,\n",
       "         0.1725, 0.2824, 0.1608, 0.1373, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000]])"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 8
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-08T01:34:09.689641Z",
     "start_time": "2025-02-08T01:34:09.677217Z"
    }
   },
   "cell_type": "code",
   "source": [
    "img \n",
    "#把transforms.ToTensor(),进行归一化  注释掉\n"
   ],
   "id": "bacded3e04a0711f",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[[0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0039, 0.0000, 0.0000, 0.0510,\n",
       "          0.2863, 0.0000, 0.0000, 0.0039, 0.0157, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0039, 0.0039, 0.0000],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0118, 0.0000, 0.1412, 0.5333,\n",
       "          0.4980, 0.2431, 0.2118, 0.0000, 0.0000, 0.0000, 0.0039, 0.0118,\n",
       "          0.0157, 0.0000, 0.0000, 0.0118],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0235, 0.0000, 0.4000, 0.8000,\n",
       "          0.6902, 0.5255, 0.5647, 0.4824, 0.0902, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0471, 0.0392, 0.0000],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.6078, 0.9255,\n",
       "          0.8118, 0.6980, 0.4196, 0.6118, 0.6314, 0.4275, 0.2510, 0.0902,\n",
       "          0.3020, 0.5098, 0.2824, 0.0588],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0039, 0.0000, 0.2706, 0.8118, 0.8745,\n",
       "          0.8549, 0.8471, 0.8471, 0.6392, 0.4980, 0.4745, 0.4784, 0.5725,\n",
       "          0.5529, 0.3451, 0.6745, 0.2588],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0039, 0.0039, 0.0039, 0.0000, 0.7843, 0.9098, 0.9098,\n",
       "          0.9137, 0.8980, 0.8745, 0.8745, 0.8431, 0.8353, 0.6431, 0.4980,\n",
       "          0.4824, 0.7686, 0.8980, 0.0000],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.7176, 0.8824, 0.8471,\n",
       "          0.8745, 0.8941, 0.9216, 0.8902, 0.8784, 0.8706, 0.8784, 0.8667,\n",
       "          0.8745, 0.9608, 0.6784, 0.0000],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.7569, 0.8941, 0.8549,\n",
       "          0.8353, 0.7765, 0.7059, 0.8314, 0.8235, 0.8275, 0.8353, 0.8745,\n",
       "          0.8627, 0.9529, 0.7922, 0.0000],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0039, 0.0118, 0.0000, 0.0471, 0.8588, 0.8627, 0.8314,\n",
       "          0.8549, 0.7529, 0.6627, 0.8902, 0.8157, 0.8549, 0.8784, 0.8314,\n",
       "          0.8863, 0.7725, 0.8196, 0.2039],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0235, 0.0000, 0.3882, 0.9569, 0.8706, 0.8627,\n",
       "          0.8549, 0.7961, 0.7765, 0.8667, 0.8431, 0.8353, 0.8706, 0.8627,\n",
       "          0.9608, 0.4667, 0.6549, 0.2196],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0157, 0.0000, 0.0000, 0.2157, 0.9255, 0.8941, 0.9020,\n",
       "          0.8941, 0.9412, 0.9098, 0.8353, 0.8549, 0.8745, 0.9176, 0.8510,\n",
       "          0.8510, 0.8196, 0.3608, 0.0000],\n",
       "         [0.0000, 0.0000, 0.0039, 0.0157, 0.0235, 0.0275, 0.0078, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.9294, 0.8863, 0.8510, 0.8745,\n",
       "          0.8706, 0.8588, 0.8706, 0.8667, 0.8471, 0.8745, 0.8980, 0.8431,\n",
       "          0.8549, 1.0000, 0.3020, 0.0000],\n",
       "         [0.0000, 0.0118, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.2431, 0.5686, 0.8000, 0.8941, 0.8118, 0.8353, 0.8667,\n",
       "          0.8549, 0.8157, 0.8275, 0.8549, 0.8784, 0.8745, 0.8588, 0.8431,\n",
       "          0.8784, 0.9569, 0.6235, 0.0000],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0706, 0.1725, 0.3216, 0.4196,\n",
       "          0.7412, 0.8941, 0.8627, 0.8706, 0.8510, 0.8863, 0.7843, 0.8039,\n",
       "          0.8275, 0.9020, 0.8784, 0.9176, 0.6902, 0.7373, 0.9804, 0.9725,\n",
       "          0.9137, 0.9333, 0.8431, 0.0000],\n",
       "         [0.0000, 0.2235, 0.7333, 0.8157, 0.8784, 0.8667, 0.8784, 0.8157,\n",
       "          0.8000, 0.8392, 0.8157, 0.8196, 0.7843, 0.6235, 0.9608, 0.7569,\n",
       "          0.8078, 0.8745, 1.0000, 1.0000, 0.8667, 0.9176, 0.8667, 0.8275,\n",
       "          0.8627, 0.9098, 0.9647, 0.0000],\n",
       "         [0.0118, 0.7922, 0.8941, 0.8784, 0.8667, 0.8275, 0.8275, 0.8392,\n",
       "          0.8039, 0.8039, 0.8039, 0.8627, 0.9412, 0.3137, 0.5882, 1.0000,\n",
       "          0.8980, 0.8667, 0.7373, 0.6039, 0.7490, 0.8235, 0.8000, 0.8196,\n",
       "          0.8706, 0.8941, 0.8824, 0.0000],\n",
       "         [0.3843, 0.9137, 0.7765, 0.8235, 0.8706, 0.8980, 0.8980, 0.9176,\n",
       "          0.9765, 0.8627, 0.7608, 0.8431, 0.8510, 0.9451, 0.2549, 0.2863,\n",
       "          0.4157, 0.4588, 0.6588, 0.8588, 0.8667, 0.8431, 0.8510, 0.8745,\n",
       "          0.8745, 0.8784, 0.8980, 0.1137],\n",
       "         [0.2941, 0.8000, 0.8314, 0.8000, 0.7569, 0.8039, 0.8275, 0.8824,\n",
       "          0.8471, 0.7255, 0.7725, 0.8078, 0.7765, 0.8353, 0.9412, 0.7647,\n",
       "          0.8902, 0.9608, 0.9373, 0.8745, 0.8549, 0.8314, 0.8196, 0.8706,\n",
       "          0.8627, 0.8667, 0.9020, 0.2627],\n",
       "         [0.1882, 0.7961, 0.7176, 0.7608, 0.8353, 0.7725, 0.7255, 0.7451,\n",
       "          0.7608, 0.7529, 0.7922, 0.8392, 0.8588, 0.8667, 0.8627, 0.9255,\n",
       "          0.8824, 0.8471, 0.7804, 0.8078, 0.7294, 0.7098, 0.6941, 0.6745,\n",
       "          0.7098, 0.8039, 0.8078, 0.4510],\n",
       "         [0.0000, 0.4784, 0.8588, 0.7569, 0.7020, 0.6706, 0.7176, 0.7686,\n",
       "          0.8000, 0.8235, 0.8353, 0.8118, 0.8275, 0.8235, 0.7843, 0.7686,\n",
       "          0.7608, 0.7490, 0.7647, 0.7490, 0.7765, 0.7529, 0.6902, 0.6118,\n",
       "          0.6549, 0.6941, 0.8235, 0.3608],\n",
       "         [0.0000, 0.0000, 0.2902, 0.7412, 0.8314, 0.7490, 0.6863, 0.6745,\n",
       "          0.6863, 0.7098, 0.7255, 0.7373, 0.7412, 0.7373, 0.7569, 0.7765,\n",
       "          0.8000, 0.8196, 0.8235, 0.8235, 0.8275, 0.7373, 0.7373, 0.7608,\n",
       "          0.7529, 0.8471, 0.6667, 0.0000],\n",
       "         [0.0078, 0.0000, 0.0000, 0.0000, 0.2588, 0.7843, 0.8706, 0.9294,\n",
       "          0.9373, 0.9490, 0.9647, 0.9529, 0.9569, 0.8667, 0.8627, 0.7569,\n",
       "          0.7490, 0.7020, 0.7137, 0.7137, 0.7098, 0.6902, 0.6510, 0.6588,\n",
       "          0.3882, 0.2275, 0.0000, 0.0000],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1569,\n",
       "          0.2392, 0.1725, 0.2824, 0.1608, 0.1373, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000]]])"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 9
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-08T01:34:19.933363Z",
     "start_time": "2025-02-08T01:34:09.690641Z"
    }
   },
   "cell_type": "code",
   "source": [
    "#计算均值和方差\n",
    "def cal_mean_std(ds):\n",
    "    mean = 0.\n",
    "    std = 0.\n",
    "    for img, _ in ds: # 遍历每张图片,img.shape=[1,28,28]\n",
    "        mean += img.mean(dim=(1, 2)) # 计算每张图片的像素均值，dim=(1,2)表示对每张图片的每行每列求均值\n",
    "        std += img.std(dim=(1, 2)) # 计算每张图片的像素方差\n",
    "    mean /= len(ds)\n",
    "    std /= len(ds)\n",
    "    return mean, std\n",
    "\n",
    "\n",
    "print(cal_mean_std(train_ds))\n"
   ],
   "id": "240d7ef331533ed1",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(tensor([0.2860]), tensor([0.3205]))\n"
     ]
    }
   ],
   "execution_count": 10
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-08T01:34:19.940373Z",
     "start_time": "2025-02-08T01:34:19.934363Z"
    }
   },
   "cell_type": "code",
   "source": "label # 标签\n",
   "id": "360dccac5c2fedd0",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "9"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 11
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-08T01:34:19.949879Z",
     "start_time": "2025-02-08T01:34:19.942371Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 显示图片，这里需要把transforms.ToTensor(),进行归一化注释掉，否则是不行的\n",
    "def show_img_content(img):\n",
    "    from PIL import Image\n",
    "\n",
    "    # 打开一个图像文件\n",
    "    # img = Image.open(img)\n",
    "\n",
    "\n",
    "    print(\"图像大小:\", img.size)\n",
    "    print(\"图像模式:\", img.mode)\n",
    "\n",
    "\n",
    "    # 如果图像是单通道的，比如灰度图，你可以这样获取像素值列表：\n",
    "    if img.mode == 'L': #img.mode是图像的模式，如果是单通道的，比如灰度图，则为'L',如果是三通道的彩色图，则为'RGB'\n",
    "        pixel_values = list(img.getdata()) # 像素值列表\n",
    "        print(pixel_values)\n",
    "show_img_content(img) #这里必须把上面的 transforms.ToTensor(), # 转换为tensor，进行归一化注释掉，否则是不行的"
   ],
   "id": "3ba2393a5fa2ccbc",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "图像大小: <built-in method size of Tensor object at 0x000001AC5D70E670>\n",
      "图像模式: <built-in method mode of Tensor object at 0x000001AC5D70E670>\n"
     ]
    }
   ],
   "execution_count": 12
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-08T01:34:20.855358Z",
     "start_time": "2025-02-08T01:34:19.950879Z"
    }
   },
   "cell_type": "code",
   "source": [
    "#这个代码必须是注释了上面的 transforms.ToTensor()才能够运行的\n",
    "def show_single_image(img_arr):\n",
    "    plt.imshow(img_arr, cmap=\"binary\") # 显示图片,cmap=\"binary\"表示黑白色\n",
    "    plt.colorbar() # 显示颜色条\n",
    "    plt.show()\n",
    "\n",
    "\n",
    "show_single_image(img) # 显示单张图片"
   ],
   "id": "c42d2d1fb1deff91",
   "outputs": [
    {
     "ename": "TypeError",
     "evalue": "Invalid shape (1, 28, 28) for image data",
     "output_type": "error",
     "traceback": [
      "\u001B[1;31m---------------------------------------------------------------------------\u001B[0m",
      "\u001B[1;31mTypeError\u001B[0m                                 Traceback (most recent call last)",
      "Cell \u001B[1;32mIn[13], line 8\u001B[0m\n\u001B[0;32m      4\u001B[0m     plt\u001B[38;5;241m.\u001B[39mcolorbar() \u001B[38;5;66;03m# 显示颜色条\u001B[39;00m\n\u001B[0;32m      5\u001B[0m     plt\u001B[38;5;241m.\u001B[39mshow()\n\u001B[1;32m----> 8\u001B[0m \u001B[43mshow_single_image\u001B[49m\u001B[43m(\u001B[49m\u001B[43mimg\u001B[49m\u001B[43m)\u001B[49m \u001B[38;5;66;03m# 显示单张图片\u001B[39;00m\n",
      "Cell \u001B[1;32mIn[13], line 3\u001B[0m, in \u001B[0;36mshow_single_image\u001B[1;34m(img_arr)\u001B[0m\n\u001B[0;32m      2\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m \u001B[38;5;21mshow_single_image\u001B[39m(img_arr):\n\u001B[1;32m----> 3\u001B[0m     \u001B[43mplt\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mimshow\u001B[49m\u001B[43m(\u001B[49m\u001B[43mimg_arr\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mcmap\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mbinary\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m)\u001B[49m \u001B[38;5;66;03m# 显示图片,cmap=\"binary\"表示黑白色\u001B[39;00m\n\u001B[0;32m      4\u001B[0m     plt\u001B[38;5;241m.\u001B[39mcolorbar() \u001B[38;5;66;03m# 显示颜色条\u001B[39;00m\n\u001B[0;32m      5\u001B[0m     plt\u001B[38;5;241m.\u001B[39mshow()\n",
      "File \u001B[1;32m~\\AppData\\Roaming\\Python\\Python312\\site-packages\\matplotlib\\pyplot.py:3592\u001B[0m, in \u001B[0;36mimshow\u001B[1;34m(X, cmap, norm, aspect, interpolation, alpha, vmin, vmax, colorizer, origin, extent, interpolation_stage, filternorm, filterrad, resample, url, data, **kwargs)\u001B[0m\n\u001B[0;32m   3570\u001B[0m \u001B[38;5;129m@_copy_docstring_and_deprecators\u001B[39m(Axes\u001B[38;5;241m.\u001B[39mimshow)\n\u001B[0;32m   3571\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m \u001B[38;5;21mimshow\u001B[39m(\n\u001B[0;32m   3572\u001B[0m     X: ArrayLike \u001B[38;5;241m|\u001B[39m PIL\u001B[38;5;241m.\u001B[39mImage\u001B[38;5;241m.\u001B[39mImage,\n\u001B[1;32m   (...)\u001B[0m\n\u001B[0;32m   3590\u001B[0m     \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39mkwargs,\n\u001B[0;32m   3591\u001B[0m ) \u001B[38;5;241m-\u001B[39m\u001B[38;5;241m>\u001B[39m AxesImage:\n\u001B[1;32m-> 3592\u001B[0m     __ret \u001B[38;5;241m=\u001B[39m \u001B[43mgca\u001B[49m\u001B[43m(\u001B[49m\u001B[43m)\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mimshow\u001B[49m\u001B[43m(\u001B[49m\n\u001B[0;32m   3593\u001B[0m \u001B[43m        \u001B[49m\u001B[43mX\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m   3594\u001B[0m \u001B[43m        \u001B[49m\u001B[43mcmap\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mcmap\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m   3595\u001B[0m \u001B[43m        \u001B[49m\u001B[43mnorm\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mnorm\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m   3596\u001B[0m \u001B[43m        \u001B[49m\u001B[43maspect\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43maspect\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m   3597\u001B[0m \u001B[43m        \u001B[49m\u001B[43minterpolation\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43minterpolation\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m   3598\u001B[0m \u001B[43m        \u001B[49m\u001B[43malpha\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43malpha\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m   3599\u001B[0m \u001B[43m        \u001B[49m\u001B[43mvmin\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mvmin\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m   3600\u001B[0m \u001B[43m        \u001B[49m\u001B[43mvmax\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mvmax\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m   3601\u001B[0m \u001B[43m        \u001B[49m\u001B[43mcolorizer\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mcolorizer\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m   3602\u001B[0m \u001B[43m        \u001B[49m\u001B[43morigin\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43morigin\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m   3603\u001B[0m \u001B[43m        \u001B[49m\u001B[43mextent\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mextent\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m   3604\u001B[0m \u001B[43m        \u001B[49m\u001B[43minterpolation_stage\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43minterpolation_stage\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m   3605\u001B[0m \u001B[43m        \u001B[49m\u001B[43mfilternorm\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mfilternorm\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m   3606\u001B[0m \u001B[43m        \u001B[49m\u001B[43mfilterrad\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mfilterrad\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m   3607\u001B[0m \u001B[43m        \u001B[49m\u001B[43mresample\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mresample\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m   3608\u001B[0m \u001B[43m        \u001B[49m\u001B[43murl\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43murl\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m   3609\u001B[0m \u001B[43m        \u001B[49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[43m(\u001B[49m\u001B[43m{\u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mdata\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[43mdata\u001B[49m\u001B[43m}\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;28;43;01mif\u001B[39;49;00m\u001B[43m \u001B[49m\u001B[43mdata\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;129;43;01mis\u001B[39;49;00m\u001B[43m \u001B[49m\u001B[38;5;129;43;01mnot\u001B[39;49;00m\u001B[43m \u001B[49m\u001B[38;5;28;43;01mNone\u001B[39;49;00m\u001B[43m \u001B[49m\u001B[38;5;28;43;01melse\u001B[39;49;00m\u001B[43m \u001B[49m\u001B[43m{\u001B[49m\u001B[43m}\u001B[49m\u001B[43m)\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m   3610\u001B[0m \u001B[43m        \u001B[49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[43mkwargs\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m   3611\u001B[0m \u001B[43m    \u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m   3612\u001B[0m     sci(__ret)\n\u001B[0;32m   3613\u001B[0m     \u001B[38;5;28;01mreturn\u001B[39;00m __ret\n",
      "File \u001B[1;32m~\\AppData\\Roaming\\Python\\Python312\\site-packages\\matplotlib\\__init__.py:1521\u001B[0m, in \u001B[0;36m_preprocess_data.<locals>.inner\u001B[1;34m(ax, data, *args, **kwargs)\u001B[0m\n\u001B[0;32m   1518\u001B[0m \u001B[38;5;129m@functools\u001B[39m\u001B[38;5;241m.\u001B[39mwraps(func)\n\u001B[0;32m   1519\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m \u001B[38;5;21minner\u001B[39m(ax, \u001B[38;5;241m*\u001B[39margs, data\u001B[38;5;241m=\u001B[39m\u001B[38;5;28;01mNone\u001B[39;00m, \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39mkwargs):\n\u001B[0;32m   1520\u001B[0m     \u001B[38;5;28;01mif\u001B[39;00m data \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m:\n\u001B[1;32m-> 1521\u001B[0m         \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[43mfunc\u001B[49m\u001B[43m(\u001B[49m\n\u001B[0;32m   1522\u001B[0m \u001B[43m            \u001B[49m\u001B[43max\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m   1523\u001B[0m \u001B[43m            \u001B[49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[38;5;28;43mmap\u001B[39;49m\u001B[43m(\u001B[49m\u001B[43mcbook\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43msanitize_sequence\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43margs\u001B[49m\u001B[43m)\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m   1524\u001B[0m \u001B[43m            \u001B[49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[43m{\u001B[49m\u001B[43mk\u001B[49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[43mcbook\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43msanitize_sequence\u001B[49m\u001B[43m(\u001B[49m\u001B[43mv\u001B[49m\u001B[43m)\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;28;43;01mfor\u001B[39;49;00m\u001B[43m \u001B[49m\u001B[43mk\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mv\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;129;43;01min\u001B[39;49;00m\u001B[43m \u001B[49m\u001B[43mkwargs\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mitems\u001B[49m\u001B[43m(\u001B[49m\u001B[43m)\u001B[49m\u001B[43m}\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m   1526\u001B[0m     bound \u001B[38;5;241m=\u001B[39m new_sig\u001B[38;5;241m.\u001B[39mbind(ax, \u001B[38;5;241m*\u001B[39margs, \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39mkwargs)\n\u001B[0;32m   1527\u001B[0m     auto_label \u001B[38;5;241m=\u001B[39m (bound\u001B[38;5;241m.\u001B[39marguments\u001B[38;5;241m.\u001B[39mget(label_namer)\n\u001B[0;32m   1528\u001B[0m                   \u001B[38;5;129;01mor\u001B[39;00m bound\u001B[38;5;241m.\u001B[39mkwargs\u001B[38;5;241m.\u001B[39mget(label_namer))\n",
      "File \u001B[1;32m~\\AppData\\Roaming\\Python\\Python312\\site-packages\\matplotlib\\axes\\_axes.py:5945\u001B[0m, in \u001B[0;36mAxes.imshow\u001B[1;34m(self, X, cmap, norm, aspect, interpolation, alpha, vmin, vmax, colorizer, origin, extent, interpolation_stage, filternorm, filterrad, resample, url, **kwargs)\u001B[0m\n\u001B[0;32m   5942\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m aspect \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;129;01mnot\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m:\n\u001B[0;32m   5943\u001B[0m     \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mset_aspect(aspect)\n\u001B[1;32m-> 5945\u001B[0m \u001B[43mim\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mset_data\u001B[49m\u001B[43m(\u001B[49m\u001B[43mX\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m   5946\u001B[0m im\u001B[38;5;241m.\u001B[39mset_alpha(alpha)\n\u001B[0;32m   5947\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m im\u001B[38;5;241m.\u001B[39mget_clip_path() \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m:\n\u001B[0;32m   5948\u001B[0m     \u001B[38;5;66;03m# image does not already have clipping set, clip to Axes patch\u001B[39;00m\n",
      "File \u001B[1;32m~\\AppData\\Roaming\\Python\\Python312\\site-packages\\matplotlib\\image.py:675\u001B[0m, in \u001B[0;36m_ImageBase.set_data\u001B[1;34m(self, A)\u001B[0m\n\u001B[0;32m    673\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;28misinstance\u001B[39m(A, PIL\u001B[38;5;241m.\u001B[39mImage\u001B[38;5;241m.\u001B[39mImage):\n\u001B[0;32m    674\u001B[0m     A \u001B[38;5;241m=\u001B[39m pil_to_array(A)  \u001B[38;5;66;03m# Needed e.g. to apply png palette.\u001B[39;00m\n\u001B[1;32m--> 675\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_A \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_normalize_image_array\u001B[49m\u001B[43m(\u001B[49m\u001B[43mA\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m    676\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_imcache \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;01mNone\u001B[39;00m\n\u001B[0;32m    677\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mstale \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;01mTrue\u001B[39;00m\n",
      "File \u001B[1;32m~\\AppData\\Roaming\\Python\\Python312\\site-packages\\matplotlib\\image.py:643\u001B[0m, in \u001B[0;36m_ImageBase._normalize_image_array\u001B[1;34m(A)\u001B[0m\n\u001B[0;32m    641\u001B[0m     A \u001B[38;5;241m=\u001B[39m A\u001B[38;5;241m.\u001B[39msqueeze(\u001B[38;5;241m-\u001B[39m\u001B[38;5;241m1\u001B[39m)  \u001B[38;5;66;03m# If just (M, N, 1), assume scalar and apply colormap.\u001B[39;00m\n\u001B[0;32m    642\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;129;01mnot\u001B[39;00m (A\u001B[38;5;241m.\u001B[39mndim \u001B[38;5;241m==\u001B[39m \u001B[38;5;241m2\u001B[39m \u001B[38;5;129;01mor\u001B[39;00m A\u001B[38;5;241m.\u001B[39mndim \u001B[38;5;241m==\u001B[39m \u001B[38;5;241m3\u001B[39m \u001B[38;5;129;01mand\u001B[39;00m A\u001B[38;5;241m.\u001B[39mshape[\u001B[38;5;241m-\u001B[39m\u001B[38;5;241m1\u001B[39m] \u001B[38;5;129;01min\u001B[39;00m [\u001B[38;5;241m3\u001B[39m, \u001B[38;5;241m4\u001B[39m]):\n\u001B[1;32m--> 643\u001B[0m     \u001B[38;5;28;01mraise\u001B[39;00m \u001B[38;5;167;01mTypeError\u001B[39;00m(\u001B[38;5;124mf\u001B[39m\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mInvalid shape \u001B[39m\u001B[38;5;132;01m{\u001B[39;00mA\u001B[38;5;241m.\u001B[39mshape\u001B[38;5;132;01m}\u001B[39;00m\u001B[38;5;124m for image data\u001B[39m\u001B[38;5;124m\"\u001B[39m)\n\u001B[0;32m    644\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m A\u001B[38;5;241m.\u001B[39mndim \u001B[38;5;241m==\u001B[39m \u001B[38;5;241m3\u001B[39m:\n\u001B[0;32m    645\u001B[0m     \u001B[38;5;66;03m# If the input data has values outside the valid range (after\u001B[39;00m\n\u001B[0;32m    646\u001B[0m     \u001B[38;5;66;03m# normalisation), we issue a warning and then clip X to the bounds\u001B[39;00m\n\u001B[0;32m    647\u001B[0m     \u001B[38;5;66;03m# - otherwise casting wraps extreme values, hiding outliers and\u001B[39;00m\n\u001B[0;32m    648\u001B[0m     \u001B[38;5;66;03m# making reliable interpretation impossible.\u001B[39;00m\n\u001B[0;32m    649\u001B[0m     high \u001B[38;5;241m=\u001B[39m \u001B[38;5;241m255\u001B[39m \u001B[38;5;28;01mif\u001B[39;00m np\u001B[38;5;241m.\u001B[39missubdtype(A\u001B[38;5;241m.\u001B[39mdtype, np\u001B[38;5;241m.\u001B[39minteger) \u001B[38;5;28;01melse\u001B[39;00m \u001B[38;5;241m1\u001B[39m\n",
      "\u001B[1;31mTypeError\u001B[0m: Invalid shape (1, 28, 28) for image data"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ],
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAbAAAAGiCAYAAACGUJO6AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAGNRJREFUeJzt3X1sVfX9wPEvD1I0k6pjgLAqU+fTFFAQhkicC7OJBucfy5gayogPczrjaDYBUfC5zqeRzSoRdfrHHDijxgipUyYxThYiSKKbYBS1zNgCcQJDLQrnl3N+aWexCLdrwU/7eiUn9Jye03v5ptw359zvvbdHlmVZAoBgeu7rOwAA7SFgAIQkYACEJGAAhCRgAIQkYACEJGAAhCRgAIQkYACEJGAAdI+AvfDCC2nixIlp8ODBqUePHunJJ5/c7TFLly5NJ598ciorK0tHHXVUeuihh9p7fwGgfQHbunVrGj58eKqtrd2j/d9+++109tlnpzPOOCOtWrUq/fKXv0wXXXRReuaZZ0q9aQBo0eN/eTPf/AzsiSeeSOeee+4u95k+fXpatGhReu2111q2/eQnP0kffvhhqqura+9NA9DN9e7sG1i2bFmaMGFCq22VlZXFmdiuNDU1FUuzHTt2pA8++CB9/etfL6IJQBz5edKWLVuKp5569uwZJ2ANDQ1p4MCBrbbl65s3b04ff/xx2n///b9wTE1NTbr++us7+64BsBetW7cuffOb34wTsPaYOXNmqq6ublnftGlTOuyww4q/fL9+/fbpfQOgNPkJS0VFRTrwwANTR+r0gA0aNCg1Nja22pav5yFq6+wrl89WzJed5ccIGEBMHf0UUKe/Dmzs2LFpyZIlrbY9++yzxXYA2GsB+89//lNMh8+X5mny+df19fUtl/+qqqpa9r/00kvT2rVr01VXXZVWr16d7rnnnvToo4+madOmtftOA0DJAXv55ZfTSSedVCy5/Lmq/OvZs2cX6++//35LzHLf+ta3imn0+VlX/vqxO++8M91///3FTEQA2CevA9ubTwCWl5cXkzk8BwYQS2c9hnsvRABCEjAAQhIwAEISMABCEjAAQhIwAEISMABCEjAAQhIwAEISMABCEjAAQhIwAEISMABCEjAAQhIwAEISMABCEjAAQhIwAEISMABCEjAAQhIwAEISMABCEjAAQhIwAEISMABCEjAAQhIwAEISMABCEjAAQhIwAEISMABCEjAAQhIwAEISMABCEjAAQhIwAEISMABCEjAAQhIwAEISMABCEjAAQhIwAEISMABCEjAAQhIwAEISMABCEjAAQhIwAEISMABCEjAAQhIwAEISMABCEjAAQhIwAEISMABCEjAAQhIwAEISMABCEjAAQhIwAEISMABCEjAAQhIwALpPwGpra9PQoUNT375905gxY9Ly5cu/dP+5c+emY445Ju2///6poqIiTZs2LX3yySftvc8AUHrAFi5cmKqrq9OcOXPSypUr0/Dhw1NlZWVav359m/s/8sgjacaMGcX+r7/+enrggQeKn3H11Vd3xP0HoJsqOWB33XVXuvjii9PUqVPT8ccfn+bNm5cOOOCA9OCDD7a5/0svvZTGjRuXzj///OKs7cwzz0znnXfebs/aAKDDArZt27a0YsWKNGHChP/+gJ49i/Vly5a1ecypp55aHNMcrLVr16bFixens846a5e309TUlDZv3txqAYDP651KsHHjxrR9+/Y0cODAVtvz9dWrV7d5TH7mlR932mmnpSzL0meffZYuvfTSL72EWFNTk66//vpS7hoA3Uynz0JcunRpuuWWW9I999xTPGf2+OOPp0WLFqUbb7xxl8fMnDkzbdq0qWVZt25dZ99NALryGVj//v1Tr169UmNjY6vt+fqgQYPaPObaa69NkydPThdddFGxfuKJJ6atW7emSy65JM2aNau4BLmzsrKyYgGADjkD69OnTxo5cmRasmRJy7YdO3YU62PHjm3zmI8++ugLkcojmMsvKQJAp5+B5fIp9FOmTEmjRo1Ko0ePLl7jlZ9R5bMSc1VVVWnIkCHF81i5iRMnFjMXTzrppOI1Y2+++WZxVpZvbw4ZAHR6wCZNmpQ2bNiQZs+enRoaGtKIESNSXV1dy8SO+vr6Vmdc11xzTerRo0fx53vvvZe+8Y1vFPG6+eabS76zANCsRxbgOl4+jb68vLyY0NGvX799fXcA+Ao8hnsvRABCEjAAQhIwAEISMABCEjAAQhIwAEISMABCEjAAQhIwAEISMABCEjAAQhIwAEISMABCEjAAQhIwAEISMABCEjAAQhIwAEISMABCEjAAQhIwAEISMABCEjAAQhIwAEISMABCEjAAQhIwAEISMABCEjAAQhIwAEISMABCEjAAQhIwAEISMABCEjAAQhIwAEISMABCEjAAQhIwAEISMABCEjAAQhIwAEISMABCEjAAQhIwAEISMABCEjAAQhIwAEISMABCEjAAQhIwAEISMABCEjAAQhIwAEISMABCEjAAQhIwAEISMABCEjAAQhIwAEISMABCEjAAQhIwALpPwGpra9PQoUNT375905gxY9Ly5cu/dP8PP/wwXX755enQQw9NZWVl6eijj06LFy9u730GgNS71AMWLlyYqqur07x584p4zZ07N1VWVqY1a9akAQMGfGH/bdu2pR/84AfF9x577LE0ZMiQ9O6776aDDjqoo/4OAHRDPbIsy0o5II/WKaecku6+++5ifceOHamioiJdccUVacaMGV/YPw/d7bffnlavXp3222+/dt3JzZs3p/Ly8rRp06bUr1+/dv0MAPaNznoML+kSYn42tWLFijRhwoT//oCePYv1ZcuWtXnMU089lcaOHVtcQhw4cGA64YQT0i233JK2b9++y9tpamoq/sKfXwCg3QHbuHFjEZ48RJ+Xrzc0NLR5zNq1a4tLh/lx+fNe1157bbrzzjvTTTfdtMvbqampKWrdvORneACwV2ch5pcY8+e/7rvvvjRy5Mg0adKkNGvWrOLS4q7MnDmzONVsXtatW9fZdxOArjyJo3///qlXr16psbGx1fZ8fdCgQW0ek888zJ/7yo9rdtxxxxVnbPklyT59+nzhmHymYr4AQIecgeWxyc+ilixZ0uoMK1/Pn+dqy7hx49Kbb75Z7NfsjTfeKMLWVrwAoFMuIeZT6OfPn58efvjh9Prrr6ef//znaevWrWnq1KnF96uqqopLgM3y73/wwQfpyiuvLMK1aNGiYhJHPqkDAPba68Dy57A2bNiQZs+eXVwGHDFiRKqrq2uZ2FFfX1/MTGyWT8B45pln0rRp09KwYcOK14HlMZs+fXq77zQAlPw6sH3B68AA4tr8VXgdGAB8VQgYACEJGAAhCRgAIQkYACEJGAAhCRgAIQkYACEJGAAhCRgAIQkYACEJGAAhCRgAIQkYACEJGAAhCRgAIQkYACEJGAAhCRgAIQkYACEJGAAhCRgAIQkYACEJGAAhCRgAIQkYACEJGAAhCRgAIQkYACEJGAAhCRgAIQkYACEJGAAhCRgAIQkYACEJGAAhCRgAIQkYACEJGAAhCRgAIQkYACEJGAAhCRgAIQkYACEJGAAhCRgAIQkYACEJGAAhCRgAIQkYACEJGAAhCRgAIQkYACEJGAAhCRgAIQkYACEJGAAhCRgAIQkYACEJGAAhCRgAIQkYACEJGADdJ2C1tbVp6NChqW/fvmnMmDFp+fLle3TcggULUo8ePdK5557bnpsFgPYHbOHCham6ujrNmTMnrVy5Mg0fPjxVVlam9evXf+lx77zzTvrVr36Vxo8fX+pNAsD/HrC77rorXXzxxWnq1Knp+OOPT/PmzUsHHHBAevDBB3d5zPbt29MFF1yQrr/++nTEEUfs9jaamprS5s2bWy0A0O6Abdu2La1YsSJNmDDhvz+gZ89ifdmyZbs87oYbbkgDBgxIF1544R7dTk1NTSovL29ZKioqSrmbAHQDJQVs48aNxdnUwIEDW23P1xsaGto85sUXX0wPPPBAmj9//h7fzsyZM9OmTZtalnXr1pVyNwHoBnp35g/fsmVLmjx5chGv/v377/FxZWVlxQIAHRKwPEK9evVKjY2Nrbbn64MGDfrC/m+99VYxeWPixIkt23bs2PH/N9y7d1qzZk068sgjS7kLAFD6JcQ+ffqkkSNHpiVLlrQKUr4+duzYL+x/7LHHpldffTWtWrWqZTnnnHPSGWecUXztuS0A9tolxHwK/ZQpU9KoUaPS6NGj09y5c9PWrVuLWYm5qqqqNGTIkGIiRv46sRNOOKHV8QcddFDx587bAaBTAzZp0qS0YcOGNHv27GLixogRI1JdXV3LxI76+vpiZiIAdKYeWZZl6Ssufx1YPp0+n5HYr1+/fX13APgKPIY7VQIgJAEDICQBAyAkAQMgJAEDICQBAyAkAQMgJAEDICQBAyAkAQMgJAEDICQBAyAkAQMgJAEDICQBAyAkAQMgJAEDICQBAyAkAQMgJAEDICQBAyAkAQMgJAEDICQBAyAkAQMgJAEDICQBAyAkAQMgJAEDICQBAyAkAQMgJAEDICQBAyAkAQMgJAEDICQBAyAkAQMgJAEDICQBAyAkAQMgJAEDICQBAyAkAQMgJAEDICQBAyAkAQMgJAEDICQBAyAkAQMgJAEDICQBAyAkAQMgJAEDICQBAyAkAQMgJAEDICQBAyAkAQMgJAEDICQBAyAkAQMgJAEDICQBA6D7BKy2tjYNHTo09e3bN40ZMyYtX758l/vOnz8/jR8/Ph188MHFMmHChC/dHwA6JWALFy5M1dXVac6cOWnlypVp+PDhqbKyMq1fv77N/ZcuXZrOO++89Pzzz6dly5alioqKdOaZZ6b33nuv1JsGgBY9sizLUgnyM65TTjkl3X333cX6jh07iihdccUVacaMGbs9fvv27cWZWH58VVVVm/s0NTUVS7PNmzcXt7Fp06bUr1+/Uu4uAPtY/hheXl7e4Y/hJZ2Bbdu2La1YsaK4DNjyA3r2LNbzs6s98dFHH6VPP/00HXLIIbvcp6ampvjLNi95vACg3QHbuHFjcQY1cODAVtvz9YaGhj36GdOnT0+DBw9uFcGdzZw5syh187Ju3bpS7iYA3UDvvXljt956a1qwYEHxvFg+AWRXysrKigUAOiRg/fv3T7169UqNjY2ttufrgwYN+tJj77jjjiJgzz33XBo2bFgpNwsA/9slxD59+qSRI0emJUuWtGzLJ3Hk62PHjt3lcbfddlu68cYbU11dXRo1alQpNwkAHXMJMZ9CP2XKlCJEo0ePTnPnzk1bt25NU6dOLb6fzywcMmRIMREj95vf/CbNnj07PfLII8Vrx5qfK/va175WLACwVwI2adKktGHDhiJKeYxGjBhRnFk1T+yor68vZiY2u/fee4vZiz/60Y9a/Zz8dWTXXXddu+40AJT8OrCu9BoCALrJ68AA4KtCwAAIScAACEnAAAhJwAAIScAACEnAAAhJwAAIScAACEnAAAhJwAAIScAACEnAAAhJwAAIScAACEnAAAhJwAAIScAACEnAAAhJwAAIScAACEnAAAhJwAAIScAACEnAAAhJwAAIScAACEnAAAhJwAAIScAACEnAAAhJwAAIScAACEnAAAhJwAAIScAACEnAAAhJwAAIScAACEnAAAhJwAAIScAACEnAAAhJwAAIScAACEnAAAhJwAAIScAACEnAAAhJwAAIScAACEnAAAhJwAAIScAACEnAAAhJwAAIScAACEnAAAhJwAAIScAACEnAAAhJwAAIScAA6D4Bq62tTUOHDk19+/ZNY8aMScuXL//S/f/85z+nY489ttj/xBNPTIsXL27v/QWA9gVs4cKFqbq6Os2ZMyetXLkyDR8+PFVWVqb169e3uf9LL72UzjvvvHThhRemV155JZ177rnF8tprr5V60wDQokeWZVkqQX7Gdcopp6S77767WN+xY0eqqKhIV1xxRZoxY8YX9p80aVLaunVrevrpp1u2ffe7300jRoxI8+bNa/M2mpqaiqXZpk2b0mGHHZbWrVuX+vXrV8rdBWAf27x5c9GJDz/8MJWXl3fcD85K0NTUlPXq1St74oknWm2vqqrKzjnnnDaPqaioyH7729+22jZ79uxs2LBhu7ydOXPm5FG1WCwWSxda3nrrrawj9S4ldhs3bkzbt29PAwcObLU9X1+9enWbxzQ0NLS5f759V2bOnFlcpmyWV/vwww9P9fX1HVvvLvq/HGeqX8447Z4x2jPGac80X0U75JBDUkcqKWB7S1lZWbHsLI+XX5Ldy8fIOO2ecdo9Y7RnjNOe6dmzYye+l/TT+vfvn3r16pUaGxtbbc/XBw0a1OYx+fZS9geADg9Ynz590siRI9OSJUtatuWTOPL1sWPHtnlMvv3z++eeffbZXe4PAJ1yCTF/bmrKlClp1KhRafTo0Wnu3LnFLMOpU6cW36+qqkpDhgxJNTU1xfqVV16ZTj/99HTnnXems88+Oy1YsCC9/PLL6b777tvj28wvJ+bT9tu6rMh/Gac9Y5x2zxjtGeO0b8ep5Gn0uXwK/e23315MxMinw//ud78rptfnvve97xUvcn7ooYdavZD5mmuuSe+880769re/nW677bZ01llndehfBIDupV0BA4B9zXshAhCSgAEQkoABEJKAARDSVyZgPqKl48dp/vz5afz48enggw8ulgkTJux2XLuCUn+XmuUv8ejRo0fxaQndQanjlL+l2+WXX54OPfTQYjr00Ucf3S3+3ZU6TvlLi4455pi0//77F28zNW3atPTJJ5+kruyFF15IEydOTIMHDy7+DT355JO7PWbp0qXp5JNPLn6XjjrqqFYz1/dY9hWwYMGCrE+fPtmDDz6Y/eMf/8guvvji7KCDDsoaGxvb3P9vf/tb8abCt912W/bPf/4zu+aaa7L99tsve/XVV7OurNRxOv/887Pa2trslVdeyV5//fXspz/9aVZeXp7961//yrqqUseo2dtvv50NGTIkGz9+fPbDH/4w6+pKHaf8jbxHjRqVnXXWWdmLL75YjNfSpUuzVatWZV1ZqeP0xz/+MSsrKyv+zMfomWeeyQ499NBs2rRpe/2+702LFy/OZs2alT3++OPFm/bu/IbvO1u7dm12wAEHZNXV1cVj+O9///viMb2urq6k2/1KBGz06NHZ5Zdf3rK+ffv2bPDgwVlNTU2b+//4xz/Ozj777FbbxowZk/3sZz/LurJSx2lnn332WXbggQdmDz/8cNZVtWeM8nE59dRTs/vvvz+bMmVKtwhYqeN07733ZkcccUS2bdu2rDspdZzyfb///e+32pY/SI8bNy7rLtIeBOyqq67KvvOd77TaNmnSpKyysrKk29rnlxC3bduWVqxYUVze+vwbPubry5Yta/OYfPvn98/lH6q5q/27gvaM084++uij9Omnn3b4O0JHH6MbbrghDRgwoPjQ1e6gPeP01FNPFW//ll9CzD9N4oQTTki33HJL8ekUXVV7xunUU08tjmm+zLh27driMqs3buicx/B9/m70e+sjWqJrzzjtbPr06cU16p1/cbrzGL344ovpgQceSKtWrUrdRXvGKX8g/utf/5ouuOCC4gH5zTffTJdddlnxH6L8LYK6ovaM0/nnn18cd9ppp+VXt9Jnn32WLr300nT11VfvpXsdw64ew/OPp/n444+L5w/3xD4/A2PvuPXWW4tJCk888UTxZDQpbdmyJU2ePLmY7JJ/0gK7lr9pd36Wmr+Haf6G3vknrc+aNWuXn6reXeUTE/Iz03vuuSetXLkyPf7442nRokXpxhtv3Nd3rUva52dgPqKl88ap2R133FEE7LnnnkvDhg1LXVWpY/TWW28V78+Zz576/AN1rnfv3mnNmjXpyCOPTF1Ne36X8pmH++23X3Fcs+OOO674n3R+qS3/pIqupj3jdO211xb/KbrooouK9XyGdP5m55dcckkR/I7+PKyodvUYnn+m2p6efeX2+Wj6iJbOG6dc/sbJ+f/+6urqik8Q6MpKHaP8ZRivvvpqcfmweTnnnHPSGWecUXydT4HuitrzuzRu3LjismFz4HNvvPFGEbauGK/2jlP+PPPOkWqOvred7YTH8OwrMlU1n3r60EMPFVMqL7nkkmKqakNDQ/H9yZMnZzNmzGg1jb53797ZHXfcUUwPnzNnTreZRl/KON16663FFODHHnsse//991uWLVu2ZF1VqWO0s+4yC7HUcaqvry9msP7iF7/I1qxZkz399NPZgAEDsptuuinrykodp/yxKB+nP/3pT8VU8b/85S/ZkUceWcyc7sq2bNlSvFwnX/Ks3HXXXcXX7777bvH9fIzysdp5Gv2vf/3r4jE8f7lP2Gn0ufx1AIcddljxgJtPXf373//e8r3TTz+9eGD5vEcffTQ7+uiji/3z6ZiLFi3KuoNSxunwww8vfpl2XvJ/ZF1Zqb9L3TFg7Rmnl156qXi5Sv6Ank+pv/nmm4uXIHR1pYzTp59+ml133XVFtPr27ZtVVFRkl112Wfbvf/8768qef/75Nh9rmscm/zMfq52PGTFiRDGu+e/TH/7wh5Jv18epABDSPn8ODADaQ8AACEnAAAhJwAAIScAACEnAAAhJwAAIScAACEnAAAhJwAAIScAASBH9H3NM/vv99i7FAAAAAElFTkSuQmCC"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 13
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-08T01:35:29.031628Z",
     "start_time": "2025-02-08T01:35:28.373506Z"
    }
   },
   "cell_type": "code",
   "source": [
    "def show_imgs(n_rows, n_cols, train_ds, class_names):\n",
    "    assert n_rows * n_cols < len(train_ds)  #确保打印的图片小于总样本数,assert用于检查条件，如果条件为False，则会抛出AssertionError异常。\n",
    "    plt.figure(figsize = (n_cols * 1.4, n_rows * 1.6))  #每张图片的大小为宽1.4高1.6，宽，高\n",
    "    for row in range(n_rows):\n",
    "        for col in range(n_cols):\n",
    "            index = n_cols * row + col  # 计算索引，从0开始\n",
    "            plt.subplot(n_rows, n_cols, index+1)#因为从1开始。plt.subplot()函数用于绘制子图。\n",
    "            img_arr, label = train_ds[index] #将这两个值分别赋值给变量 img_arr（图像数据）和 label（标签）\n",
    "            img_arr = np.transpose(img_arr, (1, 2, 0))  # 通道换到最后一维（PyTorch 的图像张量默认格式是 (通道, 高度, 宽度)，但 Matplotlib 的 plt.imshow 要求格式为 (高度, 宽度, 通道)。）\n",
    "            plt.imshow(img_arr, cmap=\"binary\",\n",
    "                       interpolation = 'nearest')#interpolation='nearest'是临近插值（图像在放大时会呈现“像素化”或“锯齿状”（不进行平滑处理），保留原始数据的锐利边缘。），cmap=\"binary\"表示黑白色\n",
    "            plt.axis('off')#去除坐标系\n",
    "            plt.title(class_names[label]) # 显示类别名称\n",
    "    plt.show()\n",
    "    \n",
    "    \n",
    "\n",
    "#已知的图片类别\n",
    "# lables在这个路径https://github.com/zalandoresearch/fashion-mnist\n",
    "class_names = ['T-shirt', 'Trouser', 'Pullover', 'Dress',\n",
    "               'Coat', 'Sandal', 'Shirt', 'Sneaker',\n",
    "               'Bag', 'Ankle boot'] #0-9分别代表的类别\n",
    "#只是打印了前15个样本\n",
    "show_imgs(3, 5, train_ds, class_names)\n"
   ],
   "id": "81c5474808d6225a",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 700x480 with 15 Axes>"
      ],
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjIAAAGMCAYAAADA5EjBAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAb4tJREFUeJztnQe41FS3hoPSe++9SRekIwqCiDQFRRFFQBRRUcGG/Cr2hogoImDFgvyi0hEFFJCuFKnSm/TeBFGQuc/KvZP7ZZ3sMOdwymTme5/nwJ7Jnkxmt+ysmi4UCoUsQgghhJAAcklaXwAhhBBCSFLhRoYQQgghgYUbGUIIIYQEFm5kCCGEEBJYuJEhhBBCSGDhRoYQQgghgYUbGUIIIYQEFm5kCCGEEBJYuJEhhBBCSGCJqo1M9+7drezZs1+wXtOmTe2/5ELOVa1atWQ7H0ketm/fbqVLl8568803L1j3+eeft+uS6IH9R0jasj1O5uBFb2SGDx9u//j69esnzxXFGa+++qo1ceJEK4hIv0fyN2fOHCuaOH36tD1po+26Uhv2X+zx6aefuvouc+bMVtGiRa2WLVtaQ4cOtU6ePJnWl0gAzsHkIf3FnuDLL7+0Spcubf3666/W5s2brfLlyyfPlcXRRqZjx45W+/btraDxxRdfuF5//vnn1syZMxO8X7ly5RS/lmeeecbq379/xJPwhRdesMvJKdkLGuy/2OXFF1+0ypQpY509e9bat2+ffcPp27ev9dZbb1mTJ0+2atSokdaXSDgHo2Mjs23bNmvhwoXW+PHjrV69etmbmueeey75ro5ENV26dHG9Xrx4sT0J9fupQfr06e0/P86fP2/9888/qXZN0Q77L3Zp1aqVVadOHef1f/7zH2vWrFlW27ZtrRtuuMFat26dlSVLFs/Pnjp1ysqWLVsqXm38wjkYBaol2bjkyZPHatOmjS1VkNd+OroPPvjAKleunJUpUyarbt261pIlSy74HStWrLAKFChg7/r+/PNPY72///7b3kSJREjOX6JECatfv372+5GybNkyq1GjRvYEl6eZkSNHJqhz4MAB6+6777YKFSpki20vv/xy67PPPvNcDB577DH7OuR6LrvsMrsNMNm4tIvUk8+HRYhiJxQvLF261BZ558+f32nzHj16eNa90Njx0u/K6wcffNAel1WrVrU/K30q40mQJ4pwu8vnSeJg/wWLZs2aWQMGDLB27NhhjR492mWXuGXLFqt169ZWjhw5rDvuuMO5ab399tt228taJ2uePLAePXo00ePgq6++smrXrm2fP2fOnFb16tWtd955JxV/fWzCOZgMEhn5cTfddJOVMWNGq3PnztaIESPsxpFG0owZM8bWz8pEkB/9xhtv2J/dunWrlSFDBs/zy7mkk+TJYtKkScYnCJlw8pQxf/58695777XFcKtXr7aGDBlibdy4MSIbFJmcMpFvvfVW+7d8/fXX1v3332//tvDA+Ouvv+wNlajQpHNl0HzzzTf2YnDs2DGrT58+dj3ZrMj1zJ4929701KxZ05o+fbr1xBNPWLt377avSxDx4T333GPVq1fPvm5BBlo8IBvC6667zp4QIs7MnTu3vekV6V5yjJ0w8hQqfSn9JZNdNp4yTqVvO3ToYJ9HoKg9cbD/gsmdd95pPfXUU9aMGTOsnj172u+dO3fOXmcbN25sP2xlzZrVfl/6S2xu7rrrLuvhhx+2JfDDhg2zfvvtN2vBggV230UyDkTCIGtq8+bNrYEDB9rviURIzhFeM0ni4RwEQklk6dKlIloIzZw50359/vz5UPHixUN9+vRx1du2bZtdL1++fKEjR44470+aNMl+f8qUKc573bp1C2XLls0uz58/P5QzZ85QmzZtQmfOnHGds0mTJvZfmC+++CJ0ySWXhObNm+eqN3LkSPs7FixY4Ptb5FxSb/Dgwc57f//9d6hmzZqhggULhv755x/7vbffftuuN3r0aKeeHGvYsGEoe/bsoRMnTtjvTZw40a738ssvu76nY8eOoXTp0oU2b97svCe/V353LNC7d2/7d0fChAkT7LpLliwx1knM2HnuuecSfLe8lnGxdu1a1/sHDx60j8lnyP/D/gs+o0aNumC/5MqVK1SrVi27LGuP1O/fv7+rjqyl8v6XX37pev+HH35wvR/JOJB7gqzl586du8hfF/twDiaNSy5GGiOixmuuucZ+Lbu8Tp062SLEf//9N0F9OSZqqDBXXXWV/b/sCDUiyZAnBNnBy+5SxFl+iFREpDCVKlWyDh065PyJKDV8vgshukHZrYYRSYy8ll2vqJyEadOmWYULF7afLsLIblaeVkTt9fPPPzv1Lr30Uvt9RFRNMja+//57K96Rpwdh6tSptkGiH4kZO5omTZpYVapU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YOFGhhBCCCGBhRsZQgghhASWmN7IbN++3UqXLp315ptvXrDu888/b9clF0f37t2t7NmzX7Be06ZN7b/kQs5VrVq1ZDsfSV0+/fRTe/7JnE3KmCtdunSKXBeJDPZffNwno5U03chI40XyN2fOHCuaOH36tL3xibbrSirDhw+327l+/fppfSmB5NVXX7UmTpxoBY3Vq1dbHTt2tEqVKmVlzpzZKlasmNWiRQvr3XffTetLIxHA/gsO7KuUJb2VhnzxxReu159//rk1c+bMBO9Xrlw5xa/lmWeesfr37x/xRuaFF16wy8kpVUgrvvzyS/uJ6Ndff7U2b95slS9fPq0vKXAbGVmk2rdvbwWFhQsXWtdcc41VsmRJq2fPnlbhwoWtnTt3WosXL7beeecd66GHHkrrSyQ+sP+CA/sqxjcyXbp0cb2WjpWNjH4/NUifPr3958f58+etf/75x4oltm3bZk+08ePHW7169bI3Nc8991xaXxZJYV555RUrV65c1pIlS6zcuXO7jh04cCDNrotEBvsvOLCvLPvhP2vWrCl2/kDbyCxdutRq2bKllT9/fitLlixWmTJlrB49enjW/eCDD6xy5cpZmTJlsurWrWsPqgvZyMjrBx980L65V61a1f7syJEjrQIFCtjHRSoTVn/J54OI/LY8efJYbdq0saUK8tpPh3qhdvRixYoVdpuJ9OrPP/801vv777/tTZRIhOT8JUqUsPr162e/HynLli2zGjVq5IwH6S+NLB533323VahQIVvMe/nll1ufffZZgnqnTp2yHnvsMfs65Houu+wyuw1CoZBTR9pF6snnw2NBdP7RzpYtW+wxrRdWoWDBgk551KhRVrNmzez3pA2qVKlijRgxIsFnRKLXtm1ba/78+Va9evXsdi1btqwtZdWsXbvWPqf0UfHixa2XX37ZfkjQTJo0yR6XRYsWtb9bxt1LL71k/fvvv1a8w/6Lvb4K329ETS32ftJm8rkffvghwed2795t3+tkDcv0f/U++eQTVx156H722Wet2rVr2xupbNmyWVdddZU1e/bsC16zrHH33nuvlTFjRvshN8zo0aPt80nf582b17rtttts6ZKXvaKsxVdffbW9gXnqqaesmJXIXAxyM7ruuuvsG6SohGSQyA0XGz3MmDFjrJMnT9oSBxksb7zxhnXTTTdZW7dutTJkyOD7PbNm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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 14
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-08T01:35:29.037537Z",
     "start_time": "2025-02-08T01:35:29.032630Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 从数据集到dataloader\n",
    "train_loader = torch.utils.data.DataLoader(train_ds, batch_size=32, shuffle=True) #batch_size分批，shuffle洗牌\n",
    "val_loader = torch.utils.data.DataLoader(test_ds, batch_size=32, shuffle=False)"
   ],
   "id": "8ba70d4018c7c8fb",
   "outputs": [],
   "execution_count": 15
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "在PyTorch中，`DataLoader`是一个迭代器，它封装了数据的加载和预处理过程，使得在训练机器学习模型时可以方便地批量加载数据。`DataLoader`主要负责以下几个方面：\n",
    "\n",
    "1. **批量加载数据**：`DataLoader`可以将数据集（Dataset）切分为更小的批次（batch），每次迭代提供一小批量数据，而不是单个数据点。这有助于模型学习数据中的统计依赖性，并且可以更高效地利用GPU等硬件的并行计算能力。\n",
    "\n",
    "2. **数据打乱**：默认情况下，`DataLoader`会在每个epoch（训练周期）开始时打乱数据的顺序。这有助于模型训练时避免陷入局部最优解，并且可以提高模型的泛化能力。\n",
    "\n",
    "3. **多线程数据加载**：`DataLoader`支持多线程（通过参数`num_workers`）来并行地加载数据，这可以显著减少训练过程中的等待时间，尤其是在处理大规模数据集时。\n",
    "\n",
    "4. **数据预处理**：`DataLoader`可以与`transforms`结合使用，对加载的数据进行预处理，如归一化、标准化、数据增强等操作。\n",
    "\n",
    "5. **内存管理**：`DataLoader`负责管理数据的内存使用，确保在训练过程中不会耗尽内存资源。\n",
    "\n",
    "6. **易用性**：`DataLoader`提供了一个简单的接口，可以很容易地集成到训练循环中。\n",
    "\n"
   ],
   "id": "bf68d75c3d0c1cb"
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "## 定义模型",
   "id": "9e0ae433bf03e4f"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-08T01:35:29.053907Z",
     "start_time": "2025-02-08T01:35:29.038540Z"
    }
   },
   "cell_type": "code",
   "source": [
    "class NeuralNetwork(nn.Module):\n",
    "    def __init__(self):\n",
    "        super().__init__() # 继承父类的初始化方法，子类有父类的属性\n",
    "        self.flatten = nn.Flatten()  # 展平层\n",
    "        self.linear_relu_stack = nn.Sequential(\n",
    "            nn.Linear(784, 300),  # in_features=784, out_features=300, 784是输入特征数，300是输出特征数\n",
    "            nn.ReLU(), # 激活函数\n",
    "            nn.Linear(300, 100),#隐藏层神经元数100\n",
    "            nn.ReLU(), # 激活函数\n",
    "            nn.Linear(100, 10),#输出层神经元数10\n",
    "        )\n",
    "\n",
    "    def forward(self, x): # 前向计算\n",
    "        # x.shape [batch size, 1, 28, 28]\n",
    "        x = self.flatten(x)  \n",
    "        # 展平后 x.shape [batch size, 784]\n",
    "        logits = self.linear_relu_stack(x)\n",
    "        # logits.shape [batch size, 10]\n",
    "        return logits #没有经过softmax,称为logits\n",
    "    \n",
    "model = NeuralNetwork()\n"
   ],
   "id": "5ccc40685455c08e",
   "outputs": [],
   "execution_count": 16
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-08T01:35:29.060243Z",
     "start_time": "2025-02-08T01:35:29.055906Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 看看网络结构\n",
    "model"
   ],
   "id": "e089d66ae0996eed",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "NeuralNetwork(\n",
       "  (flatten): Flatten(start_dim=1, end_dim=-1)\n",
       "  (linear_relu_stack): Sequential(\n",
       "    (0): Linear(in_features=784, out_features=300, bias=True)\n",
       "    (1): ReLU()\n",
       "    (2): Linear(in_features=300, out_features=100, bias=True)\n",
       "    (3): ReLU()\n",
       "    (4): Linear(in_features=100, out_features=10, bias=True)\n",
       "  )\n",
       ")"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 17
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-08T01:35:29.067333Z",
     "start_time": "2025-02-08T01:35:29.061247Z"
    }
   },
   "cell_type": "code",
   "source": "784*300+300+300*100+100+100*10+10 #计算参数数量",
   "id": "e080516e20129bdf",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "266610"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 18
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-08T01:35:29.074131Z",
     "start_time": "2025-02-08T01:35:29.068332Z"
    }
   },
   "cell_type": "code",
   "source": [
    "for name, param in model.named_parameters(): # 打印模型参数，\n",
    "      print(name, param.shape) #打印权重和偏置参数的形状\n",
    "      "
   ],
   "id": "fa08a12772c478e6",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "linear_relu_stack.0.weight torch.Size([300, 784])\n",
      "linear_relu_stack.0.bias torch.Size([300])\n",
      "linear_relu_stack.2.weight torch.Size([100, 300])\n",
      "linear_relu_stack.2.bias torch.Size([100])\n",
      "linear_relu_stack.4.weight torch.Size([10, 100])\n",
      "linear_relu_stack.4.bias torch.Size([10])\n"
     ]
    }
   ],
   "execution_count": 19
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-08T01:35:29.105886Z",
     "start_time": "2025-02-08T01:35:29.075131Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 看看模型参数\n",
    "list(model.parameters())  # 这种方法拿到模型的所有可学习参数,requires_grad=True\n"
   ],
   "id": "fc994c7bd65163de",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Parameter containing:\n",
       " tensor([[-0.0266,  0.0071,  0.0114,  ..., -0.0266, -0.0201,  0.0338],\n",
       "         [ 0.0030, -0.0109, -0.0081,  ..., -0.0244, -0.0352,  0.0093],\n",
       "         [-0.0329,  0.0051, -0.0330,  ..., -0.0310,  0.0073, -0.0169],\n",
       "         ...,\n",
       "         [ 0.0025, -0.0303,  0.0256,  ...,  0.0306, -0.0291, -0.0057],\n",
       "         [-0.0219,  0.0192,  0.0017,  ...,  0.0111, -0.0335, -0.0218],\n",
       "         [-0.0149,  0.0167,  0.0041,  ...,  0.0075, -0.0017, -0.0294]],\n",
       "        requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([-1.4368e-02,  1.7858e-02, -2.0548e-02,  2.5158e-02, -1.8905e-02,\n",
       "         -1.2097e-02,  3.4063e-02,  1.8499e-02,  8.1136e-03, -7.7525e-03,\n",
       "          1.8365e-02, -1.1457e-02,  6.7965e-03, -2.1324e-02,  4.0969e-03,\n",
       "          3.4958e-02, -3.5159e-02,  1.9772e-02,  1.0417e-02,  3.4428e-02,\n",
       "          1.5432e-02, -3.2552e-02,  1.7860e-02, -2.1406e-02, -2.2086e-02,\n",
       "         -2.3551e-02, -2.4797e-03,  1.5801e-02,  3.4298e-02,  1.6204e-04,\n",
       "         -1.6985e-02,  4.7721e-03,  1.2255e-02,  2.1161e-02,  1.5687e-02,\n",
       "          3.4003e-02, -2.9555e-02, -9.6812e-03, -2.1865e-02,  1.5284e-02,\n",
       "          1.0258e-02, -3.2417e-02,  3.0923e-02,  1.8849e-02,  1.4058e-03,\n",
       "         -1.4981e-02, -1.5245e-02, -1.5093e-02, -3.5433e-02, -1.8200e-02,\n",
       "         -2.4108e-02, -6.6030e-03, -1.1223e-02,  2.2779e-02, -2.3201e-02,\n",
       "          1.6420e-02,  1.1566e-02,  6.1911e-03,  2.9074e-02, -5.3185e-03,\n",
       "          1.8280e-02, -9.7243e-04,  1.2027e-02,  4.6644e-03, -1.1419e-02,\n",
       "          6.6895e-03,  1.5465e-02, -7.6414e-03, -3.1925e-02, -2.8501e-02,\n",
       "          3.1084e-03,  1.4773e-02, -1.8027e-02,  1.0237e-03,  3.2950e-02,\n",
       "         -5.5299e-03,  3.1718e-02, -8.3980e-04,  3.2838e-02, -3.3972e-02,\n",
       "          3.2654e-02,  2.3738e-02,  3.0044e-02,  1.2132e-02, -5.4579e-03,\n",
       "          1.2905e-02, -1.2084e-02, -3.7773e-03, -1.2113e-02,  2.7665e-02,\n",
       "          3.8449e-04, -2.7747e-02, -1.0716e-02,  1.8660e-02,  1.7137e-02,\n",
       "         -1.0590e-02, -4.4533e-03,  3.4266e-02,  1.0960e-03,  1.7660e-02,\n",
       "         -2.1115e-02, -1.4366e-02,  3.2806e-02, -3.3390e-02,  8.0530e-05,\n",
       "         -2.7198e-02,  3.0025e-04,  7.6878e-03,  3.1825e-02, -2.5714e-02,\n",
       "          3.0961e-04, -3.1623e-03, -2.1564e-02,  3.5687e-02, -3.2431e-02,\n",
       "          3.0267e-02, -7.9644e-03, -3.5033e-02,  2.2679e-02, -3.5108e-02,\n",
       "          1.5120e-02,  2.0944e-02, -2.3380e-02,  3.0627e-02,  3.3512e-02,\n",
       "         -1.4463e-02, -1.5281e-02,  2.0572e-02,  2.0433e-02,  4.9385e-03,\n",
       "         -2.0091e-02,  2.8830e-02, -2.9712e-02, -2.1538e-02, -9.7232e-03,\n",
       "         -2.9437e-02, -9.0509e-03,  2.3838e-02,  9.1289e-03,  3.0356e-02,\n",
       "         -1.7484e-02, -1.5164e-02,  2.7756e-02, -7.4461e-03,  3.4864e-02,\n",
       "         -2.0917e-02, -1.4071e-02,  1.0173e-02, -7.6768e-03,  1.7324e-02,\n",
       "         -1.6713e-02,  6.1907e-03,  2.9941e-02,  2.6181e-02, -1.6035e-02,\n",
       "         -3.5383e-03, -1.3514e-02, -2.3267e-02, -1.0959e-02,  3.2358e-02,\n",
       "          2.2712e-02, -2.2314e-02, -7.2193e-03,  3.5304e-02, -1.0694e-02,\n",
       "          2.4505e-02, -2.8195e-02, -9.2840e-03, -3.4933e-02, -2.9881e-02,\n",
       "         -2.3471e-02,  9.6582e-03,  3.4645e-02, -6.7958e-03, -2.7283e-02,\n",
       "         -7.0552e-03,  2.6781e-02,  3.0595e-02, -2.2398e-02,  1.2087e-02,\n",
       "         -4.3449e-04, -2.8906e-02, -2.3061e-02, -1.9827e-02, -1.9018e-02,\n",
       "         -1.8163e-02,  2.9605e-02,  6.7722e-03,  1.1183e-02, -3.2647e-02,\n",
       "          7.5165e-03, -2.4986e-03,  1.1875e-02, -1.3344e-02,  1.0074e-03,\n",
       "         -8.9864e-03,  2.3314e-02, -2.4280e-02, -2.2117e-02,  3.5061e-02,\n",
       "          2.9113e-02, -3.4504e-02, -1.4009e-02, -2.3584e-02, -2.7418e-02,\n",
       "         -5.3802e-03,  2.0356e-02, -1.7004e-02, -1.2105e-02,  3.0662e-03,\n",
       "          3.0331e-02,  1.0597e-02, -1.9424e-02,  3.2610e-02, -5.8763e-03,\n",
       "         -7.6219e-03,  3.2681e-03, -1.8133e-02,  1.8788e-02, -5.0563e-03,\n",
       "         -1.5015e-02, -4.7076e-03, -3.0480e-02, -2.5596e-04,  2.6357e-02,\n",
       "          4.5359e-03,  1.2823e-02,  3.5573e-02, -3.4924e-02, -2.9372e-02,\n",
       "          5.7939e-03,  3.4752e-02,  3.1930e-02, -2.9425e-02,  1.0984e-02,\n",
       "          1.8088e-02, -2.8406e-02,  4.7333e-03,  7.2782e-03,  1.4330e-02,\n",
       "         -2.9594e-02,  2.6011e-02, -9.4352e-03,  3.0972e-02,  1.4271e-02,\n",
       "          2.3524e-02,  6.7105e-03, -1.7666e-03, -1.9531e-02, -1.0105e-02,\n",
       "         -8.0858e-03, -5.6402e-03, -3.0988e-02,  3.7181e-03, -2.0861e-02,\n",
       "          1.4295e-02, -3.2854e-02, -2.6421e-02, -2.3756e-02, -3.1615e-02,\n",
       "          1.8633e-02,  5.2696e-03, -1.2313e-02, -2.8000e-02,  3.0927e-02,\n",
       "         -1.7902e-02,  1.3680e-02, -1.7026e-02, -3.5213e-02,  9.5394e-03,\n",
       "         -5.2383e-03,  6.7807e-03,  1.7391e-02,  2.1536e-02, -3.0507e-02,\n",
       "         -9.9098e-03, -1.3526e-02, -1.0154e-03, -5.3348e-03, -2.2140e-02,\n",
       "         -2.4994e-03, -9.6758e-03, -9.9189e-03, -7.9287e-03, -2.4649e-02,\n",
       "         -2.4341e-02, -2.5989e-02, -1.8494e-02, -7.5271e-04,  3.5054e-02,\n",
       "         -3.1608e-02,  1.6968e-02, -1.5988e-02,  3.8308e-04, -3.4372e-02,\n",
       "          1.9352e-02,  3.0845e-02,  8.3666e-03,  1.6851e-02, -3.2820e-02],\n",
       "        requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([[-0.0003,  0.0019, -0.0329,  ..., -0.0002,  0.0059, -0.0053],\n",
       "         [-0.0190, -0.0485,  0.0550,  ...,  0.0418, -0.0323,  0.0242],\n",
       "         [-0.0453,  0.0423,  0.0476,  ..., -0.0395, -0.0432,  0.0050],\n",
       "         ...,\n",
       "         [ 0.0251,  0.0003,  0.0231,  ...,  0.0445,  0.0287, -0.0117],\n",
       "         [ 0.0447, -0.0463,  0.0529,  ..., -0.0211,  0.0294, -0.0043],\n",
       "         [ 0.0165, -0.0456, -0.0165,  ..., -0.0258, -0.0291, -0.0460]],\n",
       "        requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([ 4.3831e-02, -5.4059e-02,  4.2767e-02, -4.9577e-02,  3.2336e-02,\n",
       "         -4.0861e-02,  5.5319e-02, -2.1404e-03,  4.2360e-02, -6.6947e-03,\n",
       "         -2.3101e-02,  4.1169e-02, -1.5542e-02,  9.0567e-03,  5.4657e-02,\n",
       "          1.6111e-02, -9.3634e-04,  2.4621e-02, -4.6056e-03,  3.3726e-02,\n",
       "         -3.2400e-02, -6.7655e-04, -7.8354e-03, -3.7249e-02, -3.0358e-02,\n",
       "          4.7082e-03, -5.6401e-02,  4.6357e-02,  4.9646e-02, -2.0972e-02,\n",
       "         -3.3732e-02, -1.4419e-03,  2.9982e-02,  5.7495e-02,  7.8315e-03,\n",
       "         -2.3237e-03, -2.7151e-02,  2.7432e-02, -1.2625e-02, -7.2620e-03,\n",
       "         -4.3582e-02,  5.1938e-02, -9.0711e-06, -1.3956e-02, -7.2204e-03,\n",
       "         -2.3733e-02,  5.5616e-02,  8.2361e-03, -7.2372e-03,  5.4085e-02,\n",
       "          5.6626e-02,  3.2948e-02, -2.8127e-02, -5.7496e-02, -2.2348e-02,\n",
       "          1.3039e-02, -3.2877e-02, -2.2353e-02, -1.1894e-03, -4.5468e-02,\n",
       "         -1.9797e-02, -5.2480e-02, -3.4844e-02, -4.1095e-02,  4.4038e-02,\n",
       "         -5.2617e-02, -4.8430e-02,  2.1936e-02,  1.1851e-02, -2.1443e-03,\n",
       "         -1.6442e-02, -5.2236e-02, -3.6494e-02, -5.1133e-02,  3.4995e-02,\n",
       "          2.2000e-02, -1.6838e-02, -5.4495e-02, -2.1762e-02,  7.6396e-04,\n",
       "          3.2384e-02, -1.7717e-02,  2.1952e-02,  3.9280e-02,  5.1909e-03,\n",
       "          4.4785e-03,  4.0402e-02, -1.9443e-02,  4.6753e-02, -1.8630e-02,\n",
       "          4.6366e-02,  1.1749e-02,  4.6104e-02,  5.6351e-02, -5.4288e-02,\n",
       "         -2.8718e-02, -4.4968e-02,  5.7731e-02, -5.3443e-02, -4.1642e-02],\n",
       "        requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([[ 4.4749e-03,  9.6086e-02,  1.6816e-02, -3.7674e-02, -6.5981e-02,\n",
       "           7.7894e-02,  2.4968e-02,  5.5631e-02,  2.6034e-02, -5.0325e-02,\n",
       "           1.0022e-03,  3.3512e-02, -7.1258e-02, -4.0335e-02, -6.4952e-02,\n",
       "           5.7745e-02, -7.8127e-02, -5.4305e-02, -3.2184e-02, -8.4929e-02,\n",
       "          -3.8964e-02, -2.6997e-03,  2.2473e-02,  3.3882e-02, -8.8044e-02,\n",
       "          -2.4322e-02, -3.8825e-02, -9.6174e-02, -5.4375e-03,  2.8544e-02,\n",
       "          -5.2688e-02, -7.7205e-02,  3.7121e-02, -2.8662e-02,  4.3447e-02,\n",
       "           5.5500e-02, -5.7899e-02,  2.2140e-02,  7.9943e-02, -8.9904e-02,\n",
       "           4.2723e-02,  1.2417e-02,  2.0634e-02, -4.8391e-02, -2.3291e-02,\n",
       "           6.2575e-03, -2.9169e-04, -1.9390e-02, -4.6880e-02,  4.7051e-02,\n",
       "          -3.2456e-02, -6.9147e-02,  1.6779e-02,  4.4929e-03, -4.0901e-02,\n",
       "          -5.5342e-02,  7.4507e-02, -6.1823e-02, -9.8303e-02,  7.4261e-02,\n",
       "          -8.4546e-02, -1.1426e-02, -1.7031e-02,  7.0868e-02, -2.1166e-02,\n",
       "          -4.2112e-03, -1.9702e-02,  4.7909e-02,  3.3111e-02, -2.5737e-02,\n",
       "           9.9385e-02,  9.1226e-02,  2.7693e-02, -2.2788e-02,  5.7347e-02,\n",
       "          -9.0317e-02, -4.5961e-03,  5.2121e-02, -6.1432e-02, -2.8492e-02,\n",
       "           6.9936e-02,  9.6719e-02, -2.5450e-02, -5.5283e-02, -7.3719e-02,\n",
       "          -3.9151e-02,  2.1842e-02, -1.8701e-02,  6.3952e-02,  3.1154e-02,\n",
       "          -2.9795e-02, -6.2423e-02,  9.5903e-02,  7.4704e-02,  1.1519e-02,\n",
       "          -6.4559e-02, -3.7282e-02, -7.4874e-02, -7.4385e-02,  9.1022e-02],\n",
       "         [-6.7390e-02, -5.7790e-02,  1.2851e-02,  9.3736e-03,  1.1599e-02,\n",
       "           5.1831e-02,  9.9498e-02,  3.4775e-02, -1.9217e-02, -4.3038e-02,\n",
       "           7.2928e-03, -8.7389e-02,  7.6717e-02,  3.5157e-02,  6.4477e-02,\n",
       "          -1.4545e-02, -4.5698e-02,  6.2396e-02, -1.1961e-02,  9.7768e-03,\n",
       "           9.8998e-02, -1.0880e-02,  1.4201e-02, -8.3928e-02,  1.6377e-02,\n",
       "           3.0558e-02, -6.6485e-02,  4.1703e-02,  2.6559e-02, -4.7412e-02,\n",
       "          -7.7744e-02,  4.9796e-02, -2.8784e-02,  4.6454e-03,  4.5750e-02,\n",
       "          -6.9080e-02, -9.5311e-02,  5.7472e-02, -2.4487e-02, -4.4695e-02,\n",
       "          -5.8727e-02,  2.4970e-02,  4.6206e-03,  6.5868e-02, -6.2913e-02,\n",
       "          -6.1097e-02,  8.9015e-02,  7.1097e-02, -3.0350e-02,  7.2015e-02,\n",
       "           7.0796e-02, -1.7988e-02,  8.3209e-02, -6.7883e-02, -4.6157e-02,\n",
       "           4.7246e-02,  5.5380e-02, -3.3199e-02, -4.3752e-02, -3.1079e-02,\n",
       "           6.3630e-02, -8.0903e-02,  9.1533e-02,  5.3734e-02,  8.4780e-02,\n",
       "          -3.1690e-02,  8.3198e-02, -9.0204e-02, -1.8728e-02, -6.6275e-02,\n",
       "           2.4372e-02,  5.4300e-02, -1.0688e-02,  3.6658e-02, -1.3529e-02,\n",
       "           3.1562e-02,  6.7673e-03, -4.9762e-03, -9.1791e-02,  4.5471e-02,\n",
       "           8.8786e-02,  8.3919e-02,  5.6512e-02, -7.8555e-02, -4.4741e-02,\n",
       "           4.5620e-05, -7.3304e-02,  4.1067e-02,  7.3991e-02,  5.4652e-02,\n",
       "          -9.5276e-02, -8.1925e-02,  6.2669e-02, -7.0741e-02,  7.0440e-02,\n",
       "           9.4052e-02, -2.6402e-03,  5.9542e-02, -5.4463e-02,  4.7400e-02],\n",
       "         [-6.6970e-02,  2.4644e-02, -7.5551e-02, -4.1937e-02,  2.5945e-02,\n",
       "          -4.7134e-02,  4.9370e-02,  5.5410e-02,  5.0595e-03, -9.7980e-03,\n",
       "           3.0800e-02,  1.6056e-02, -8.3343e-02,  1.6929e-02, -9.6977e-02,\n",
       "           9.7846e-02,  9.8676e-02, -2.8657e-02, -7.0320e-02,  8.7982e-02,\n",
       "          -6.7105e-02,  3.9124e-02,  4.7315e-02,  1.9869e-02,  2.9164e-02,\n",
       "          -1.1398e-02,  8.0049e-02, -6.1887e-02,  4.4406e-02,  6.9700e-02,\n",
       "          -5.5381e-02, -8.6716e-03, -8.9993e-02, -5.6200e-02,  4.2339e-02,\n",
       "          -8.1010e-02,  2.5205e-02,  5.9913e-02,  3.1337e-02, -2.6720e-02,\n",
       "           6.6407e-02, -9.8549e-02, -2.2069e-02,  2.2999e-02, -6.8794e-02,\n",
       "           5.2123e-02, -3.9860e-02, -6.4932e-03, -8.0338e-03,  1.4456e-02,\n",
       "          -1.8735e-03, -7.9281e-02, -1.2227e-02,  6.9220e-02, -9.3184e-02,\n",
       "           1.6593e-02,  4.7427e-03,  6.5536e-02,  6.3452e-02, -8.6952e-02,\n",
       "          -1.8910e-02, -3.0064e-03, -8.5470e-02,  6.9263e-02, -2.3818e-02,\n",
       "          -9.3150e-02,  4.3660e-02,  8.8967e-02, -1.5378e-02,  5.9643e-02,\n",
       "          -5.8694e-02,  8.2688e-02, -3.8749e-02,  4.3602e-02, -5.5046e-02,\n",
       "           2.4719e-02,  7.9989e-02, -9.0510e-02,  6.6689e-02, -9.0864e-03,\n",
       "           9.2745e-02,  9.1785e-02,  7.5202e-02, -8.8688e-02, -8.7619e-06,\n",
       "           9.6689e-02,  7.8087e-02, -3.2571e-02,  8.7833e-02, -5.3214e-02,\n",
       "           8.6078e-02, -7.5339e-02, -2.5194e-02, -1.5008e-02,  1.8139e-02,\n",
       "          -9.4746e-02, -2.6214e-02,  7.0072e-02, -1.8535e-02, -4.5580e-02],\n",
       "         [ 6.6186e-02,  9.7115e-02, -2.2689e-02,  6.9038e-02, -6.0626e-02,\n",
       "          -4.3168e-02,  8.2173e-02,  6.1428e-02,  1.2154e-02, -7.9358e-02,\n",
       "           9.1627e-02, -5.8181e-02,  7.8129e-02, -7.8469e-02,  3.6106e-03,\n",
       "          -5.2536e-03,  2.0012e-02, -7.2078e-02,  2.4718e-02,  1.0737e-03,\n",
       "           2.8986e-02,  7.4843e-02, -2.6636e-02,  2.5276e-02, -3.1891e-02,\n",
       "          -5.4483e-03, -1.6867e-02, -2.3664e-02,  2.9398e-02, -3.4919e-02,\n",
       "           3.8391e-02, -4.2050e-02,  3.0651e-02, -5.9312e-02,  1.8800e-02,\n",
       "           4.9812e-02,  5.0596e-03, -5.4574e-03,  1.5249e-02, -8.1914e-02,\n",
       "           8.0679e-02,  7.8342e-02,  3.6131e-02,  9.5854e-02, -7.6692e-03,\n",
       "          -3.4655e-02, -3.1046e-02,  4.9753e-03, -4.5125e-02, -5.3100e-02,\n",
       "           9.5532e-02, -4.0203e-02,  1.6492e-02,  6.5180e-02, -2.7318e-02,\n",
       "           8.1961e-02,  6.6759e-02,  3.1528e-02,  8.6829e-02,  2.0770e-02,\n",
       "          -9.6421e-02, -4.6466e-02,  5.8979e-02, -2.0987e-02, -5.9492e-02,\n",
       "          -8.6314e-03, -3.2945e-02,  7.9904e-02,  6.7627e-02, -2.0081e-02,\n",
       "          -9.2889e-02,  7.4812e-02, -5.7358e-02, -8.5837e-02,  4.6476e-02,\n",
       "           3.7024e-02,  3.7046e-02,  5.2171e-02,  4.0035e-02, -7.8606e-02,\n",
       "           9.0864e-02,  9.5650e-02, -9.0526e-03,  6.7393e-03, -3.2002e-02,\n",
       "          -9.8525e-02, -1.5742e-02,  7.1401e-02, -2.1515e-02,  1.6748e-02,\n",
       "          -5.4993e-02,  8.9201e-02,  4.9516e-02, -4.1919e-02, -4.0501e-02,\n",
       "          -5.6476e-02,  4.3132e-02, -8.8164e-02,  1.8276e-02,  2.0136e-02],\n",
       "         [ 3.0227e-02, -8.7915e-02, -5.2330e-02, -1.9440e-02, -8.9441e-02,\n",
       "          -8.0426e-02, -6.2529e-02, -9.3306e-02,  3.3487e-02,  9.0967e-02,\n",
       "          -6.9160e-02,  3.6285e-02, -1.8226e-02,  1.9100e-02,  1.5970e-02,\n",
       "          -5.6749e-02, -7.1484e-03,  6.9036e-02, -2.4817e-02,  4.0093e-02,\n",
       "           9.3101e-02,  4.6772e-02, -7.3796e-02,  9.6052e-02, -7.4915e-02,\n",
       "           3.8572e-02,  7.2506e-02,  1.8891e-02,  1.0160e-02,  7.7340e-02,\n",
       "           8.1833e-03,  8.6020e-02,  8.5930e-02, -5.9365e-02,  9.1367e-02,\n",
       "           8.5666e-02, -9.4831e-03, -3.8367e-03, -4.5399e-02,  5.3577e-02,\n",
       "          -3.8270e-02, -2.8744e-02, -5.1806e-02, -6.0496e-02,  9.8066e-02,\n",
       "          -1.5572e-03, -3.6587e-03,  1.4255e-02, -1.0391e-02, -2.6344e-02,\n",
       "           3.0386e-02,  8.0464e-02,  2.9446e-02, -6.6302e-02, -7.0109e-02,\n",
       "          -2.6675e-04,  5.0070e-02, -1.4653e-02,  8.2327e-02,  6.2986e-02,\n",
       "           2.6216e-02, -9.0439e-02, -3.5406e-03,  1.3623e-02, -1.5128e-02,\n",
       "          -9.0724e-02,  7.6610e-02,  8.9189e-02,  5.5559e-02, -6.4802e-03,\n",
       "          -1.1285e-02, -9.9755e-02,  2.3295e-02,  3.8689e-02,  1.9663e-03,\n",
       "           3.4495e-04,  9.0277e-02,  8.0204e-02,  6.9322e-02,  3.1613e-02,\n",
       "          -2.1439e-02,  9.0258e-02, -5.7471e-02,  9.2443e-02, -6.7417e-02,\n",
       "           2.7121e-02,  2.9939e-02,  3.8279e-02,  3.3933e-02,  1.5726e-02,\n",
       "           2.8269e-02, -7.0784e-02, -9.9680e-02,  9.4316e-02,  3.3539e-03,\n",
       "           8.1045e-02, -5.4148e-02, -6.4989e-02, -6.7785e-02,  9.8001e-02],\n",
       "         [-8.5882e-02, -5.2661e-02,  9.6671e-02, -6.0528e-02, -5.2399e-03,\n",
       "           4.9548e-02,  3.2492e-02, -7.0022e-02, -7.5393e-02, -9.7163e-03,\n",
       "          -7.2179e-03, -2.6304e-02, -4.9805e-02,  3.4562e-02,  5.9819e-02,\n",
       "          -3.5958e-02, -1.9157e-02,  2.1860e-02, -8.0443e-02, -6.3513e-02,\n",
       "           7.3685e-02, -6.2659e-02,  1.6391e-02,  5.8210e-03, -6.5892e-02,\n",
       "           5.5554e-02,  6.1930e-02, -2.8243e-02,  8.6868e-02,  2.5864e-02,\n",
       "          -4.7311e-02,  2.4561e-02, -4.2844e-02,  1.4565e-02, -9.5460e-02,\n",
       "          -7.0695e-02,  3.5733e-02,  6.2151e-02,  9.4385e-02,  7.6218e-02,\n",
       "          -5.3126e-02,  7.3430e-02, -5.4233e-02, -1.1632e-02, -3.3590e-02,\n",
       "           8.3353e-02,  7.5299e-02, -6.3355e-02,  5.9279e-02,  5.1811e-02,\n",
       "           4.6199e-02, -6.1612e-02, -7.1338e-02, -1.8899e-02, -3.4155e-02,\n",
       "          -6.6131e-02, -3.9148e-02,  8.7839e-02,  1.6353e-02,  1.7975e-04,\n",
       "           9.7531e-02, -9.3910e-02, -8.6197e-02, -4.2668e-02, -7.8827e-02,\n",
       "          -9.5987e-02,  1.3291e-02, -1.7439e-03, -2.9185e-02,  3.6879e-02,\n",
       "          -7.9626e-02, -2.7976e-02, -6.4541e-02,  2.5545e-02, -6.1522e-02,\n",
       "           4.5907e-02, -9.1049e-02,  3.5751e-02, -8.4604e-02, -4.4067e-02,\n",
       "           4.3585e-02, -9.5960e-02,  9.6135e-02,  7.8682e-02, -6.2907e-02,\n",
       "           2.8647e-02, -6.8332e-03, -4.2635e-02, -3.1501e-02,  1.0202e-02,\n",
       "          -9.5665e-02,  2.0464e-02, -1.3685e-02,  1.7034e-02, -6.5305e-02,\n",
       "          -4.6213e-03, -3.5593e-02, -3.3629e-04, -3.3456e-02,  5.1098e-02],\n",
       "         [-8.6724e-02,  7.2323e-02,  4.0084e-03,  5.0682e-02, -6.6248e-02,\n",
       "          -6.2143e-02, -8.6460e-02,  4.5176e-02, -1.8471e-02, -8.4686e-02,\n",
       "          -1.5309e-02,  6.1543e-02, -4.8682e-02,  5.5241e-02,  5.4154e-02,\n",
       "          -1.1537e-02, -9.8566e-02, -6.5911e-02, -5.4510e-02, -4.3931e-03,\n",
       "          -9.6744e-02, -8.2266e-02,  5.9956e-02,  2.8160e-02, -9.7905e-02,\n",
       "          -4.5666e-03,  3.4083e-02, -5.4515e-02,  4.2350e-02, -1.4607e-02,\n",
       "           9.4177e-02,  8.1033e-02,  6.7281e-02, -9.7020e-02,  6.7121e-03,\n",
       "           9.6560e-02, -2.6929e-02,  5.3017e-02,  1.9392e-02,  9.1528e-02,\n",
       "          -7.2620e-02, -2.2701e-02,  9.2971e-02,  7.6539e-02, -8.8400e-02,\n",
       "          -3.0766e-02,  3.6276e-02, -8.3498e-02,  5.6087e-02,  9.1166e-02,\n",
       "           9.3472e-02, -2.8376e-02,  7.4105e-02, -6.4490e-02, -5.7327e-02,\n",
       "           3.9562e-02,  2.7367e-02,  9.9332e-02, -3.9699e-02, -9.5370e-02,\n",
       "           4.0463e-02, -3.6040e-02,  9.9874e-03, -2.2552e-02,  8.5910e-02,\n",
       "           5.7202e-02,  4.8201e-02,  6.4587e-02,  5.0834e-02,  8.5352e-03,\n",
       "          -5.5944e-02,  6.4789e-02,  2.5898e-02,  7.1797e-02,  5.0890e-02,\n",
       "          -5.2681e-02, -1.9515e-02,  6.0402e-02,  1.4049e-02,  8.7030e-02,\n",
       "          -3.6564e-02, -7.2204e-03, -3.8470e-02,  6.7301e-02,  5.0930e-02,\n",
       "           9.3192e-02,  6.6766e-02,  5.7755e-02,  3.0423e-02, -8.4903e-02,\n",
       "           9.9867e-02, -8.4513e-02, -2.7771e-02, -6.1536e-03,  9.1239e-02,\n",
       "           6.4166e-02, -4.5519e-03, -2.7738e-03,  9.8286e-02, -2.0969e-02],\n",
       "         [ 4.6981e-02, -4.3154e-02, -3.5751e-02,  1.0959e-02,  4.6281e-02,\n",
       "          -6.9814e-02,  1.8127e-02,  2.6351e-02,  5.2588e-02,  5.8373e-02,\n",
       "          -4.3418e-02, -1.6604e-02, -9.9751e-02,  3.2182e-02, -2.8474e-02,\n",
       "           9.4946e-02,  4.2231e-02, -5.3411e-02,  1.3798e-02, -2.9711e-02,\n",
       "          -5.3199e-02,  5.2974e-02, -5.7044e-02, -4.3096e-02, -9.3039e-02,\n",
       "           8.3136e-02, -1.3675e-02, -2.1009e-02,  1.0352e-02, -7.9649e-02,\n",
       "          -3.9216e-02,  8.4712e-02,  7.1114e-02,  7.8606e-02, -3.1179e-02,\n",
       "           2.8371e-02, -4.8873e-02, -7.3931e-02, -7.3665e-02, -5.2150e-02,\n",
       "           4.2364e-02,  5.7699e-02,  1.8624e-02,  8.6449e-02, -5.2788e-02,\n",
       "           5.7618e-02, -8.9104e-02, -2.9671e-02, -3.4392e-02,  2.5154e-02,\n",
       "          -4.6464e-02,  8.6921e-02, -6.3604e-02,  8.0803e-03, -9.5994e-02,\n",
       "           2.8880e-02,  2.6878e-03, -2.6934e-02,  2.6385e-02, -7.3376e-02,\n",
       "           5.1371e-02, -9.7382e-02,  3.0412e-02, -4.3484e-03, -5.6103e-02,\n",
       "          -3.8909e-02, -5.3822e-02, -2.7967e-02, -8.4097e-02,  2.1650e-02,\n",
       "           6.1929e-02, -5.5214e-02, -4.7274e-03,  2.8772e-02,  9.6737e-02,\n",
       "           1.5178e-02, -2.8041e-02, -2.3706e-02,  7.3653e-02,  7.3764e-03,\n",
       "           8.8419e-02,  6.7846e-02,  2.3113e-02,  4.8569e-02, -4.9089e-02,\n",
       "          -3.3044e-02,  3.3739e-02,  3.2828e-02, -8.0018e-02,  5.7935e-02,\n",
       "          -5.4090e-03, -2.6669e-02, -5.5824e-02, -2.0160e-02,  1.7707e-02,\n",
       "          -6.1257e-02, -7.9356e-02, -4.9593e-02,  1.0590e-02,  5.5341e-02],\n",
       "         [-5.1636e-02,  5.1257e-02, -1.6632e-02,  5.7194e-02, -6.1643e-02,\n",
       "          -8.6538e-02, -4.0424e-02, -3.7193e-02, -8.4953e-02,  6.0058e-02,\n",
       "          -4.7440e-02, -3.9868e-02,  4.9094e-02, -4.0186e-02, -4.9674e-02,\n",
       "          -9.8909e-02,  7.2609e-02, -1.1924e-02, -5.2092e-02, -2.7450e-02,\n",
       "           9.2034e-02, -1.2710e-02, -5.1869e-02,  8.9247e-02, -7.7953e-02,\n",
       "           3.8091e-02, -8.8405e-02,  2.0149e-02, -4.6654e-02,  2.4989e-02,\n",
       "          -5.8076e-02, -8.9970e-02, -6.2184e-02,  5.4472e-02,  4.8994e-03,\n",
       "          -1.0689e-03, -2.8747e-03, -1.0991e-02,  2.3349e-02, -1.3113e-02,\n",
       "           4.4694e-02,  1.3093e-02,  4.1645e-02, -2.8896e-02,  4.6488e-02,\n",
       "           2.0240e-02, -6.3571e-02, -1.2639e-02,  3.9812e-02,  8.2958e-02,\n",
       "          -8.0781e-03, -6.2092e-02,  9.1979e-03, -8.6883e-03,  7.5253e-02,\n",
       "           8.8129e-02,  4.9751e-02,  8.0921e-02, -5.8439e-02,  3.0887e-02,\n",
       "          -8.2493e-02, -7.1058e-02,  6.6204e-04,  8.0645e-02,  4.9277e-02,\n",
       "           6.7305e-02,  9.2483e-02,  1.7582e-02, -3.0081e-02, -4.9489e-02,\n",
       "           1.3380e-02, -9.0528e-02, -1.1139e-02, -9.2044e-03, -6.7045e-02,\n",
       "           3.3957e-02,  4.3402e-02, -3.0251e-02, -5.3465e-02,  8.3357e-02,\n",
       "           8.2784e-02, -5.6077e-02,  4.3846e-03, -4.2915e-02,  1.9330e-03,\n",
       "          -2.0918e-02,  2.8405e-02, -8.7743e-02, -4.5255e-02,  4.7749e-02,\n",
       "          -9.6111e-02,  5.4875e-02, -6.8242e-02,  2.9363e-02,  9.8013e-02,\n",
       "           6.5467e-02, -7.9716e-02, -6.4118e-02,  1.5459e-02,  5.9134e-02],\n",
       "         [ 3.7117e-02, -5.8836e-02,  3.6407e-02,  6.8284e-02,  1.1783e-02,\n",
       "           1.2052e-02,  8.7090e-02, -9.6620e-02, -5.7050e-02, -1.0588e-02,\n",
       "          -3.9105e-02,  2.7654e-02, -3.8209e-02, -2.6608e-02,  4.0957e-02,\n",
       "           1.0476e-02,  3.3405e-02,  2.5527e-02,  5.1984e-02,  2.5371e-02,\n",
       "          -1.9973e-02, -2.6759e-04, -1.8345e-02,  5.6640e-02, -7.8943e-02,\n",
       "           6.5786e-02,  1.6938e-02, -8.2080e-03, -6.8387e-02,  7.5565e-02,\n",
       "           6.0875e-02, -5.1213e-02, -9.6352e-02, -7.1121e-02,  8.6661e-04,\n",
       "          -5.7775e-02,  6.8586e-02,  5.7619e-02,  7.3768e-02, -2.8476e-02,\n",
       "           2.7322e-02, -9.6148e-02,  8.4950e-03, -6.5036e-02, -1.3974e-02,\n",
       "           6.7122e-02, -2.9755e-02,  6.0231e-02,  7.9715e-02, -5.5703e-02,\n",
       "           9.3043e-02, -4.2611e-02,  1.7352e-02, -2.4603e-02, -2.7053e-02,\n",
       "           9.0814e-02,  4.1944e-02,  3.2748e-02, -5.8931e-02,  2.8334e-02,\n",
       "          -2.9456e-02, -4.0690e-02, -7.4826e-02, -5.2823e-03, -7.5526e-02,\n",
       "           1.1183e-02, -1.2998e-02,  5.0646e-03,  1.7841e-02, -6.0240e-02,\n",
       "          -8.2476e-02, -3.5197e-04, -6.4300e-02,  3.1186e-02,  8.1195e-02,\n",
       "          -9.2298e-02, -9.1914e-02,  2.9726e-04,  2.5380e-02, -1.9541e-02,\n",
       "           2.7578e-02,  1.7109e-02, -7.2274e-02,  9.2455e-02, -8.5993e-02,\n",
       "          -8.0658e-02, -2.1162e-02, -5.7726e-02,  6.4641e-02, -5.1305e-02,\n",
       "          -7.7696e-02, -3.1077e-02, -7.7262e-02,  2.4836e-02,  8.8342e-02,\n",
       "          -8.1316e-02, -4.6308e-02, -9.3937e-02,  6.7631e-02, -5.6730e-02]],\n",
       "        requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([-0.0625,  0.0351,  0.0712, -0.0226,  0.0237,  0.0865, -0.0492,  0.0964,\n",
       "          0.0721,  0.0554], requires_grad=True)]"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 20
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-08T01:35:29.110874Z",
     "start_time": "2025-02-08T01:35:29.106885Z"
    }
   },
   "cell_type": "code",
   "source": "# model.state_dict()  # 这种方法用于保存模型参数，看能看见参数属于模型的哪一部分",
   "id": "29072e796d36184a",
   "outputs": [],
   "execution_count": 21
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "## 训练\n",
    "\n",
    "pytorch的训练需要自行实现，包括\n",
    "1. 定义损失函数\n",
    "2. 定义优化器\n",
    "3. 定义训练步\n",
    "4. 训练"
   ],
   "id": "ceaf604d1c0704a3"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-08T01:35:29.117650Z",
     "start_time": "2025-02-08T01:35:29.111872Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 1. 定义损失函数 采用交叉熵损失\n",
    "loss_fct = nn.CrossEntropyLoss() #内部先做softmax，然后计算交叉熵\n",
    "# 2. 定义优化器 采用SGD（随机梯度下降）\n",
    "# Optimizers specified in the torch.optim package,随机梯度下降\n",
    "optimizer = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9)\n"
   ],
   "id": "26e10dd6ec83d78f",
   "outputs": [],
   "execution_count": 22
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-08T01:35:29.248926Z",
     "start_time": "2025-02-08T01:35:29.120646Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "@torch.no_grad() # 装饰器，禁止反向传播，节省内存（这对于评估模型（validation）或测试模型（testing）时特别有用，因为在这些阶段不需要更新模型的参数，因此不需要计算梯度）\n",
    "def evaluating(model, dataloader, loss_fct):\n",
    "    loss_list = [] # 记录损失\n",
    "    pred_list = [] # 记录预测\n",
    "    label_list = [] # 记录标签\n",
    "    for datas, labels in dataloader:#10000/32=312\n",
    "        datas = datas.to(device) # 转到GPU\n",
    "        labels = labels.to(device) # 转到GPU\n",
    "        # 前向计算\n",
    "        logits = model(datas)\n",
    "        loss = loss_fct(logits, labels)         # 验证集损失\n",
    "        loss_list.append(loss.item()) # 记录损失\n",
    "        \n",
    "        preds = logits.argmax(axis=-1)    # 验证集预测,argmax返回最大值索引。#沿最后一个维度取最大值的索引（即预测类别）\n",
    "        # print(preds)\n",
    "        pred_list.extend(preds.cpu().numpy().tolist())#将PyTorch张量转换为NumPy数组。只有当张量在CPU上时，这个转换才是合法的\n",
    "        # print(preds.cpu().numpy().tolist())\n",
    "        label_list.extend(labels.cpu().numpy().tolist())\n",
    "        \n",
    "    acc = accuracy_score(label_list, pred_list) # 计算准确率\n",
    "    return np.mean(loss_list), acc\n"
   ],
   "id": "e0e2f37ea3dbe5be",
   "outputs": [],
   "execution_count": 23
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-08T01:40:52.693268Z",
     "start_time": "2025-02-08T01:35:29.250924Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 训练\n",
    "def training(model, train_loader, val_loader, epoch, loss_fct, optimizer, eval_step=500): #train_loader表示训练集，val_loader表示验证集，epoch表示训练的轮数，loss_fct表示损失函数，optimizer表示优化器，eval_step表示每eval_step步进行一次验证集评估\n",
    "    record_dict = {\n",
    "        \"train\": [],\n",
    "        \"val\": []\n",
    "    }\n",
    "    \n",
    "    global_step = 0 # 全局步数\n",
    "    model.train() # 进入训练模式\n",
    "    with tqdm(total=epoch * len(train_loader)) as pbar: # 进度条 1875*20,60000/32=1875\n",
    "        for epoch_id in range(epoch): # 训练epoch次\n",
    "            # training\n",
    "            for datas, labels in train_loader: #执行次数是60000/32=1875\n",
    "                datas = datas.to(device) #datas尺寸是[batch_size,1,28,28]\n",
    "                labels = labels.to(device) #labels尺寸是[batch_size]\n",
    "                # 梯度清空\n",
    "                optimizer.zero_grad() #PyTorch等框架默认会累加梯度而非替换。每次调用loss.backward()时，梯度会累加到参数的.grad属性中。若不及时清空，后续批次的梯度会与前序批次叠加，导致参数更新异常\n",
    "                # 模型前向计算\n",
    "                logits = model(datas)\n",
    "                # 计算损失\n",
    "                loss = loss_fct(logits, labels)\n",
    "                # 梯度回传，loss.backward()会计算梯度，loss对模型参数求导\n",
    "                loss.backward() \n",
    "                # 调整优化器，包括学习率的变动等,优化器的学习率会随着训练的进行而减小，更新w,b\n",
    "                optimizer.step() #梯度是计算并存储在模型参数的 .grad 属性中，优化器使用这些存储的梯度来更新模型参数\n",
    "\n",
    "                preds = logits.argmax(axis=-1) # 训练集预测\n",
    "                acc = accuracy_score(labels.cpu().numpy(), preds.cpu().numpy())   # 计算准确率，numpy可以\n",
    "                loss = loss.cpu().item() # 损失转到CPU，item()取值,一个数值\n",
    "                # record\n",
    "                \n",
    "                record_dict[\"train\"].append({\n",
    "                    \"loss\": loss, \"acc\": acc, \"step\": global_step\n",
    "                }) # 记录训练集信息，每一步的损失，准确率，步数\n",
    "                \n",
    "                # evaluating\n",
    "                if global_step % eval_step == 0:\n",
    "                    model.eval() # 进入评估模式\n",
    "                    val_loss, val_acc = evaluating(model, val_loader, loss_fct) # 评估模型，evaluate函数定义在上面\n",
    "                    record_dict[\"val\"].append({\n",
    "                        \"loss\": val_loss, \"acc\": val_acc, \"step\": global_step\n",
    "                    })\n",
    "                    model.train() # 回到训练模式\n",
    "\n",
    "                # udate step\n",
    "                global_step += 1 # 全局步数加1\n",
    "                pbar.update(1) # 更新进度条\n",
    "                pbar.set_postfix({\"epoch\": epoch_id}) # 设置进度条显示信息\n",
    "        \n",
    "    return record_dict\n",
    "        \n",
    "\n",
    "epoch = 20 #改为40\n",
    "model = model.to(device) #\n",
    "record = training(model, train_loader, val_loader, epoch, loss_fct, optimizer, eval_step=1000)\n"
   ],
   "id": "f6123747ec000ebd",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "  0%|          | 0/37500 [00:00<?, ?it/s]"
      ],
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "868831a1e8bf4bab9b50e80ef5545325"
      }
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 24
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-08T01:40:52.699582Z",
     "start_time": "2025-02-08T01:40:52.694268Z"
    }
   },
   "cell_type": "code",
   "source": "1875*20",
   "id": "ed62f980fdc15b96",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "37500"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 25
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-08T01:40:52.713276Z",
     "start_time": "2025-02-08T01:40:52.700583Z"
    }
   },
   "cell_type": "code",
   "source": "record[\"train\"][-5:]",
   "id": "4ee8ae660eb713f",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{'loss': 0.5034245252609253, 'acc': 0.78125, 'step': 37495},\n",
       " {'loss': 0.20878815650939941, 'acc': 0.90625, 'step': 37496},\n",
       " {'loss': 0.2280440777540207, 'acc': 0.90625, 'step': 37497},\n",
       " {'loss': 0.4592934548854828, 'acc': 0.875, 'step': 37498},\n",
       " {'loss': 0.1596129983663559, 'acc': 0.9375, 'step': 37499}]"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 26
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-08T01:40:52.721089Z",
     "start_time": "2025-02-08T01:40:52.714275Z"
    }
   },
   "cell_type": "code",
   "source": "record[\"val\"][-5:]",
   "id": "fbc007aeba83f8f0",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{'loss': 0.3563100922102936, 'acc': 0.8723, 'step': 33000},\n",
       " {'loss': 0.35913720388953296, 'acc': 0.8731, 'step': 34000},\n",
       " {'loss': 0.3532470095033844, 'acc': 0.8741, 'step': 35000},\n",
       " {'loss': 0.3587047073026054, 'acc': 0.8728, 'step': 36000},\n",
       " {'loss': 0.35826604151592467, 'acc': 0.873, 'step': 37000}]"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 27
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-08T01:49:26.083438Z",
     "start_time": "2025-02-08T01:49:25.876402Z"
    }
   },
   "cell_type": "code",
   "source": [
    "#画线要注意的是损失是不一定在零到1之间的\n",
    "def plot_learning_curves(record_dict, sample_step=1000):\n",
    "    # build DataFrame\n",
    "    train_df = pd.DataFrame(record_dict[\"train\"]).set_index(\"step\").iloc[::sample_step]\n",
    "    val_df = pd.DataFrame(record_dict[\"val\"]).set_index(\"step\")\n",
    "    last_step = train_df.index[-1] # 最后一步的步数\n",
    "    # print(train_df.columns)\n",
    "    print(train_df['acc'])\n",
    "    print(val_df['acc'])\n",
    "    # plot\n",
    "    fig_num = len(train_df.columns) # 画几张图,分别是损失和准确率\n",
    "    fig, axs = plt.subplots(1, fig_num, figsize=(5 * fig_num, 5)) #1 表示子图的行数为1，也就是子图会排成一行.fig_num 表示子图的列数，也就是会生成多少张子图.figsize=(5 * fig_num, 5) 设置了整个图形窗口的大小,这里宽度被设置为 5 * fig_num，即每张子图的宽度为5英寸，总宽度根据子图数量变化；高度设置为5英寸。\n",
    "    for idx, item in enumerate(train_df.columns):\n",
    "        print(idx, item)\n",
    "        # print(train_df[item].values)\n",
    "        axs[idx].plot(train_df.index, train_df[item], label=f\"train_{item}\")\n",
    "        axs[idx].plot(val_df.index, val_df[item], label=f\"val_{item}\")\n",
    "        axs[idx].grid() # 显示网格\n",
    "        axs[idx].legend() # 显示图例\n",
    "        axs[idx].set_xticks(range(0, train_df.index[-1], 5000)) # 设置x轴刻度\n",
    "        axs[idx].set_xticklabels(map(lambda x: f\"{int(x/1000)}k\", range(0, last_step, 5000))) # 设置x轴标签.,map()函数用于将一个函数映射到一个序列上，这里将一个匿名函数映射到一个范围上，即将一个数值转换为字符串。\n",
    "        axs[idx].set_xlabel(\"step\")\n",
    "        \n",
    "    \n",
    "    plt.show()\n",
    "\n",
    "plot_learning_curves(record)  #横坐标是 steps"
   ],
   "id": "4ec290d7af7a095d",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "step\n",
      "0        0.15625\n",
      "1000     0.71875\n",
      "2000     0.90625\n",
      "3000     0.84375\n",
      "4000     0.78125\n",
      "5000     0.84375\n",
      "6000     0.75000\n",
      "7000     0.78125\n",
      "8000     0.87500\n",
      "9000     0.75000\n",
      "10000    0.75000\n",
      "11000    0.84375\n",
      "12000    0.71875\n",
      "13000    0.84375\n",
      "14000    0.81250\n",
      "15000    0.93750\n",
      "16000    0.93750\n",
      "17000    0.87500\n",
      "18000    0.87500\n",
      "19000    0.75000\n",
      "20000    0.87500\n",
      "21000    0.87500\n",
      "22000    0.96875\n",
      "23000    0.84375\n",
      "24000    0.78125\n",
      "25000    0.96875\n",
      "26000    0.87500\n",
      "27000    0.96875\n",
      "28000    0.96875\n",
      "29000    1.00000\n",
      "30000    0.93750\n",
      "31000    0.87500\n",
      "32000    0.90625\n",
      "33000    0.93750\n",
      "34000    0.87500\n",
      "35000    0.90625\n",
      "36000    0.96875\n",
      "37000    0.90625\n",
      "Name: acc, dtype: float64\n",
      "step\n",
      "0        0.1287\n",
      "1000     0.6861\n",
      "2000     0.7666\n",
      "3000     0.7950\n",
      "4000     0.8114\n",
      "5000     0.8205\n",
      "6000     0.8170\n",
      "7000     0.8286\n",
      "8000     0.8300\n",
      "9000     0.8375\n",
      "10000    0.8322\n",
      "11000    0.8436\n",
      "12000    0.8394\n",
      "13000    0.8391\n",
      "14000    0.8503\n",
      "15000    0.8548\n",
      "16000    0.8524\n",
      "17000    0.8525\n",
      "18000    0.8556\n",
      "19000    0.8577\n",
      "20000    0.8564\n",
      "21000    0.8609\n",
      "22000    0.8571\n",
      "23000    0.8566\n",
      "24000    0.8622\n",
      "25000    0.8617\n",
      "26000    0.8485\n",
      "27000    0.8593\n",
      "28000    0.8671\n",
      "29000    0.8658\n",
      "30000    0.8715\n",
      "31000    0.8706\n",
      "32000    0.8689\n",
      "33000    0.8723\n",
      "34000    0.8731\n",
      "35000    0.8741\n",
      "36000    0.8728\n",
      "37000    0.8730\n",
      "Name: acc, dtype: float64\n",
      "0 loss\n",
      "1 acc\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 1000x500 with 2 Axes>"
      ],
      "image/png": "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pT179pj8P/74o9idk7KqwsJCk7eqqkrsjqz+4aSscNf53ik53XC+d1JWp52XnJLVKTntntd1HZ233npLevXqJVFRUXLTTTfJd999J3Y0b948c0A0vV199dViB9u2bZO77rrLfNqst8Km61fk5ORIt27dpH379pKeni6///67LbNOmjTpnHbOzMwMStaFCxfKjTfeaD5JvUuXLjJq1CgpLy9vts+pU6dkxowZ0qlTJ4mOjpZ77rlH/vrrL1tmHT58+Dltm52dLcHw9ttvy/XXX9/4AWapqanyxRdf2K5dLySrndoVoVWb7FyXFLXJP6hN/uGkuuTm2uSqjk5eXp488cQTZtm7H374QQYOHCgjRoyQw4cPix31799fDh482Hj7+uuvxQ5OnDhh2k4LszeLFy+WN998U9555x3ZsWOHXHbZZaad9ZfWblmVFo+m7bxq1SoJhq1bt5qTWnFxsWzatEnq6uokIyPDPAePxx9/XD799FNZs2aN2f/AgQMyZswYW2ZVU6dObda2emwEg35C/aJFi+T777+XkpISue222yQrK0t++eUXW7XrhWS1U7si9GqTXeuSojb5B7XJP5xUl1xdmywXGTJkiDVjxozG7bNnz1rdu3e3Fi5caLb16ebn5zfen5OTYyUmJlq7du0KeNbc3Fxr4MCBPu+3S9aWORoaGkyOV155pfF7VVVVVmRkpLVq1SqzXVlZaR63c+dOs11fX29NnjzZ6tevn/XHH38ELKuaOHGilZWV5fMxwcqqDh8+bP7fW7dubWzH8PBwa82aNY37/Prrr2af7du3m+2CggKzffToUbN94sQJKzMz07r55psbvxeIrOrWW2+1HnvsMZ+PCVZWj8svv9xatmyZrdu1ZVYntCvcW5ucUpe8ZaE2XTrUJv9xUl1yS21yzRWdM2fOmF6oXqr2aNOmjdnevn17s331vDNr1iz54IMPpKioyFyqCwa9pK6Xtfv06SMTJkyQvXv3nrOPXbJ6VFZWyqFDh5q1c2xsrJmK0bKd1enTp2Xs2LFmnrHm79mzZ1Dmjeol7n79+sn06dPln3/+8bpfoLMeO3bMfI2Pjzdf9fjV0ammbavTRjSHt7bVebC33367NDQ0mJGtuLi4gGX1WLlypSQkJMh1110nzzzzjNTW1np9fCCznj17VlavXm1G+PTSu53btWVWO7crQqM2ObEu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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 34
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-08T01:46:42.617151Z",
     "start_time": "2025-02-08T01:46:42.576007Z"
    }
   },
   "cell_type": "code",
   "source": [
    "train_df = pd.DataFrame(record[\"train\"]).set_index(\"step\").iloc[::1000]\n",
    "train_df.columns\n",
    "# enumerate(train_df.columns)"
   ],
   "id": "ff7fc464299f989e",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index(['loss', 'acc'], dtype='object')"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 33
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
